bare-types 0.3.0

A zero-cost foundation for type-safe domain modeling in Rust. Implements the 'Parse, don't validate' philosophy to eliminate primitive obsession and ensure data integrity at the system boundary.
Documentation
//! Example: Email address validation with bare-types
#![allow(unused_crate_dependencies)]

use bare_types::net::Email;

fn main() {
    println!("=== bare-types Email demo ===\n");

    let email: Email = "user@example.com".parse().expect("Valid email");
    println!("Parsed Email: {}", email);

    println!("\nEmail Components:");
    println!("  Local part: {}", email.local_part());
    println!("  Domain part: {}", email.domain_part());

    println!("\nMore Examples:");

    let emails = [
        "admin@company.com",
        "user+tag@example.com",
        "support@subdomain.domain.com",
    ];

    for email_str in emails {
        match email_str.parse::<Email>() {
            Ok(email) => println!(
                "{} -> local: {}, domain: {}",
                email_str,
                email.local_part(),
                email.domain_part()
            ),
            Err(e) => println!("{} -> Error: {}", email_str, e),
        }
    }

    println!("\nInvalid Examples:");
    let invalid_emails = ["", "invalid", "@example.com", "user@", "user@ example.com"];

    for email_str in invalid_emails {
        match email_str.parse::<Email>() {
            Ok(_) => println!("  ? {} (unexpected success)", email_str),
            Err(_) => println!("{} -> Invalid (expected)", email_str),
        }
    }

    println!("\nAll types are:");
    println!("  - Zero-cost abstractions");
    println!("  - Fully no_std compatible");
    println!("  - Type-safe with validation at construction");
    println!("  - RFC 5322 compliant");
}