Skip to content

Commit 4bcae1c

Browse files
committed
ID3v2: Handle whitespace in number strings
Now whitespace will be trimmed and empty strings will be ignored.
1 parent 2f995c1 commit 4bcae1c

File tree

1 file changed

+41
-8
lines changed

1 file changed

+41
-8
lines changed

src/id3/v2/util/pairs.rs

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,53 @@ where
3535

3636
/// Attempts to convert a `TagItem` to a number, passing it to `setter`
3737
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);
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

Comments
 (0)