@@ -35,20 +35,53 @@ where
3535
3636/// Attempts to convert a `TagItem` to a number, passing it to `setter`
3737pub ( 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) ;
4039
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) => {
4452 log:: warn!(
4553 "\" {}\" cannot be parsed as number in {:?}: {parse_error}" ,
4654 text. unwrap( ) ,
4755 item. key( )
4856 )
4957 } ,
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" ) ) ;
5386 }
5487}
0 commit comments