@@ -35,20 +35,53 @@ where
35
35
36
36
/// Attempts to convert a `TagItem` to a number, passing it to `setter`
37
37
pub ( crate ) fn set_number < F : FnMut ( u32 ) > ( item : & TagItem , mut setter : F ) {
38
- let text = item. value ( ) . text ( ) ;
39
- let number = text. map ( str:: parse :: < u32 > ) ;
38
+ let text = item. value ( ) . text ( ) . map ( str:: trim) ;
40
39
41
- match number {
42
- Some ( Ok ( number) ) => setter ( number) ,
43
- Some ( Err ( parse_error) ) => {
40
+ let trimmed;
41
+ match text {
42
+ None | Some ( "" ) => {
43
+ log:: warn!( "Value does not have text in {:?}" , item. key( ) ) ;
44
+ return ;
45
+ } ,
46
+ Some ( trimmed_text) => trimmed = trimmed_text,
47
+ }
48
+
49
+ match trimmed. parse :: < u32 > ( ) {
50
+ Ok ( number) => setter ( number) ,
51
+ Err ( parse_error) => {
44
52
log:: warn!(
45
53
"\" {}\" cannot be parsed as number in {:?}: {parse_error}" ,
46
54
text. unwrap( ) ,
47
55
item. key( )
48
56
)
49
57
} ,
50
- None => {
51
- log:: warn!( "Value does not have text in {:?}" , item. key( ) )
52
- } ,
58
+ }
59
+ }
60
+
61
+ #[ cfg( test) ]
62
+ mod tests {
63
+ use crate :: id3:: v2:: util:: pairs:: set_number;
64
+ use crate :: { ItemKey , ItemValue , TagItem } ;
65
+
66
+ #[ test]
67
+ fn whitespace_in_number ( ) {
68
+ let item = TagItem :: new (
69
+ ItemKey :: TrackNumber ,
70
+ ItemValue :: Text ( String :: from ( " 12 " ) ) ,
71
+ ) ;
72
+ set_number ( & item, |number| assert_eq ! ( number, 12 ) ) ;
73
+ }
74
+
75
+ #[ test]
76
+ fn empty_number_string ( ) {
77
+ let item = TagItem :: new ( ItemKey :: TrackNumber , ItemValue :: Text ( String :: new ( ) ) ) ;
78
+ set_number ( & item, |_| unreachable ! ( "Should not be called" ) ) ;
79
+
80
+ // Also with whitespace only strings
81
+ let item = TagItem :: new (
82
+ ItemKey :: TrackNumber ,
83
+ ItemValue :: Text ( String :: from ( " " ) ) ,
84
+ ) ;
85
+ set_number ( & item, |_| unreachable ! ( "Should not be called" ) ) ;
53
86
}
54
87
}
0 commit comments