omitty 0.1.0

TypeScript-like Omit<> for Rust structs - no boilerplate
Documentation
use omitty::OmittableType;

#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, OmittableType)]
#[omit_variant(UserPublic, password, email, phone, address)]
#[omit_variant(UserMinimal, password, email, phone, address, bio, avatar_url)]
#[omit_variant(UserAdmin, password)]
pub struct User {
    pub id: String,
    pub username: String,
    pub password: String,
    pub email: String,
    pub phone: String,
    pub address: String,
    pub bio: String,
    pub avatar_url: String,
}

fn main() {
    // UserPublic - for general API responses
    let public_json = r#"{
        "id": "123",
        "username": "john_doe",
        "bio": "Software developer",
        "avatar_url": "https://example.com/avatar.jpg"
    }"#;

    let public_user: UserPublic = serde_json::from_str(public_json).unwrap();
    println!("Public User:");
    println!("   ID: {}", public_user.id);
    println!("   Username: {}", public_user.username);
    println!("   Bio: {}", public_user.bio);
    println!("   Avatar: {}", public_user.avatar_url);
    println!();

    // UserMinimal - for list views and search results
    let minimal_json = r#"{
        "id": "456",
        "username": "jane_smith"
    }"#;

    let minimal_user: UserMinimal = serde_json::from_str(minimal_json).unwrap();
    println!("Minimal User (for lists):");
    println!("   ID: {}", minimal_user.id);
    println!("   Username: {}", minimal_user.username);
    println!();

    // UserAdmin - for admin panel (all fields except password)
    let admin_json = r#"{
        "id": "789",
        "username": "admin_user",
        "email": "admin@example.com",
        "phone": "+1234567890",
        "address": "123 Main St",
        "bio": "System administrator",
        "avatar_url": "https://example.com/admin.jpg"
    }"#;

    let admin_user: UserAdmin = serde_json::from_str(admin_json).unwrap();
    println!("Admin View:");
    println!("   ID: {}", admin_user.id);
    println!("   Username: {}", admin_user.username);
    println!("   Email: {}", admin_user.email);
    println!("   Phone: {}", admin_user.phone);
    println!("   Address: {}", admin_user.address);
    println!("   Bio: {}", admin_user.bio);
    println!();

    // Demonstrate serialization
    let serialized_public = serde_json::to_string_pretty(&public_user).unwrap();
    println!("Serialized Public User:");
    println!("{}", serialized_public);
}