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: MAC address parsing and manipulation
#![allow(unused_crate_dependencies)]

use bare_types::net::MacAddress;

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

    let mac: MacAddress = "00:1A:2B:3C:4D:5E".parse().expect("Valid MAC");
    println!("Parsed MAC: {}", mac);

    println!("\nMAC Properties:");
    println!("  As string (colon): {}", mac.as_str());
    println!("  As string (dash): {}", mac.as_str_dash());
    println!("  As string (lower): {}", mac.as_str_lower());
    println!("  Octets: {:?}", mac.octets());

    println!("\nAddress Types:");
    println!("  Is unicast: {}", mac.is_unicast());
    println!("  Is multicast: {}", mac.is_multicast());
    println!(
        "  Is globally administered: {}",
        mac.is_globally_administered()
    );
    println!(
        "  Is locally administered: {}",
        mac.is_locally_administered()
    );

    println!("\nMAC Components:");
    println!("  OUI (Organization Unique ID): {:?}", mac.oui());
    println!("  NIC (Network Interface Controller): {:?}", mac.nic());

    println!("\nVarious Formats:");
    let formats = ["00:1A:2B:3C:4D:5E", "00-1A-2B-3C-4D-5E", "001A2B3C4D5E"];

    for format in formats {
        match format.parse::<MacAddress>() {
            Ok(m) => println!("{} -> {}", format, m.as_str()),
            Err(e) => println!("{} -> Error: {}", format, e),
        }
    }

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