ezcal 0.3.4

Ergonomic iCalendar + vCard library for Rust
Documentation
use ezcal::vcard::Contact;

fn main() {
    // Example .vcf content with multiple contacts (normally you'd read from a file)
    let vcf_content = "\
BEGIN:VCARD\r\n\
VERSION:4.0\r\n\
UID:urn:uuid:f47ac10b-58cc-4372-a567-0e02b2c3d479\r\n\
FN:Jane Doe\r\n\
N:Doe;Jane;;Dr.;\r\n\
EMAIL;TYPE=work:jane@acme.com\r\n\
EMAIL;TYPE=home:jane.doe@gmail.com\r\n\
TEL;TYPE=work,voice:+1-555-0123\r\n\
ORG:Acme Corp\r\n\
TITLE:Software Engineer\r\n\
ADR;TYPE=work:;;123 Main St;San Francisco;CA;94105;USA\r\n\
NOTE:Met at RustConf 2025\r\n\
URL:https://jane.example.com\r\n\
BDAY:19900115\r\n\
END:VCARD\r\n\
BEGIN:VCARD\r\n\
VERSION:4.0\r\n\
UID:urn:uuid:a1b2c3d4-e5f6-7890-abcd-ef0123456789\r\n\
FN:Bob Smith\r\n\
N:Smith;Bob;;;\r\n\
EMAIL:bob@example.com\r\n\
TEL:+1-555-9876\r\n\
ORG:Example Inc.\r\n\
END:VCARD\r\n";

    // Parse all contacts
    let contacts = Contact::parse_all(vcf_content).unwrap();

    println!("Found {} contacts:\n", contacts.len());

    for contact in &contacts {
        println!("Name: {}", contact.get_full_name().unwrap_or("(unknown)"));

        if let Some(name) = contact.get_name() {
            println!("  Family: {}, Given: {}", name.family, name.given);
            if !name.prefix.is_empty() {
                println!("  Prefix: {}", name.prefix);
            }
        }

        if let Some(org) = contact.get_organization() {
            println!("  Organization: {}", org);
        }

        if let Some(title) = contact.get_title() {
            println!("  Title: {}", title);
        }

        for email in contact.get_emails() {
            let type_str = if email.types.is_empty() {
                String::new()
            } else {
                format!(" ({})", email.types.join(", "))
            };
            println!("  Email: {}{}", email.value, type_str);
        }

        for phone in contact.get_phones() {
            let type_str = if phone.types.is_empty() {
                String::new()
            } else {
                format!(" ({})", phone.types.join(", "))
            };
            println!("  Phone: {}{}", phone.value, type_str);
        }

        for addr in contact.get_addresses() {
            println!(
                "  Address: {}, {}, {} {} ({})",
                addr.address.street,
                addr.address.city,
                addr.address.region,
                addr.address.postal_code,
                addr.types.join(", ")
            );
        }

        if let Some(note) = contact.get_note() {
            println!("  Note: {}", note);
        }

        if let Some(url) = contact.get_url() {
            println!("  URL: {}", url);
        }

        if let Some(bday) = contact.get_birthday() {
            println!("  Birthday: {}", bday);
        }

        println!();
    }
}