diff --git a/src/parser.rs b/src/parser.rs index 3987b33..85dd286 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -280,8 +280,15 @@ impl<'s> VcardParser<'s> { params.language = Some(tag); } VALUE => { - let value: ValueType = value.parse()?; - params.value = Some(value); + if self.strict { + let value: ValueType = value.parse()?; + params.value = Some(value); + } else { + if let Ok(value) = value.parse::() + { + params.value = Some(value); + } + } } PREF => { let value: u8 = value.parse()?; diff --git a/tests/parameters.rs b/tests/parameters.rs index f57ab1d..7ad2d7a 100644 --- a/tests/parameters.rs +++ b/tests/parameters.rs @@ -8,7 +8,7 @@ use vcard4::{ Pid, RelatedType, TelephoneType, TimeZoneParameter, TypeParameter, ValueType, }, - parse, Error, + parse, parse_loose, Error, }; use test_helpers::{assert_language, assert_media_type, assert_round_trip}; @@ -368,3 +368,18 @@ END:VCARD"#; Ok(()) } + +// SEE: https://github.com/tmpfs/vcard4/issues/21 +#[test] +fn param_nextcloud_ignore_bad_value() -> Result<()> { + let input = r#"BEGIN:VCARD +VERSION:3.0 +FN:Example Card2 +TEL;TYPE=CELL;VALUE=UNKNOWN:+01555123456 +END:VCARD"#; + + assert!(parse(input).is_err()); + assert!(parse_loose(input).is_ok()); + + Ok(()) +}