use std::borrow::Cow;
use vcard::{
param::VcardParam, prop::VcardProp, tree::cst::VcardCst, value::VcardValue, vcard::Vcard,
version::VcardVersion,
};
fn main() {
let card = Vcard {
version: VcardVersion::V4_0,
properties: vec![
VcardProp {
name: "MAILER".into(),
params: vec![],
value: VcardValue::Text("Mutt".into()),
},
VcardProp {
name: "EMAIL".into(),
params: vec![VcardParam::Language(Cow::Borrowed("en"))],
value: VcardValue::Text("john@example.com".into()),
},
VcardProp {
name: "N".into(),
params: vec![],
value: VcardValue::Text("Doe, John".into()),
},
],
};
let errors = card.validate().unwrap_err();
println!("{} violations:", errors.len());
for error in errors {
println!(" {error}");
}
let input = concat!(
"BEGIN:VCARD\r\n",
"VERSION:3.0\r\n",
"FN:John Doe\r\n",
"EMAIL;TYPE=INTERNET:john@example.com\r\n",
"END:VCARD\r\n",
);
let mut card = VcardCst::parse(input).unwrap();
println!();
report("as exported", &card);
card.fill_required();
report("repaired ", &card);
print!("\n{card}");
}
fn report(label: &str, card: &VcardCst) {
match card.decode().validate() {
Ok(_) => println!("{label}: conformant"),
Err(errors) => {
let errors: Vec<_> = errors.iter().map(ToString::to_string).collect();
println!("{label}: {}", errors.join("; "));
}
}
}