omitty 0.2.0

On-demand TypeScript-like Omit<> for Rust - generate type variants with omitted fields using #[omitty] and Omit! macro
Documentation
use omitty::omitty;

#[omitty]
mod api {
    #[derive(omitty::Omittable, Debug, Clone, serde::Serialize, serde::Deserialize)]
    pub struct User {
        pub id: u64,
        pub name: String,
        pub email: String,
        pub password_hash: String,
        pub secret_token: String,
    }

    #[derive(Debug, Clone)]
    pub struct PublicProfile {
        pub user: Omit!(User, password_hash, secret_token, email),
    }

    #[derive(Debug, Clone)]
    pub struct AdminView {
        pub user: Omit!(User, secret_token),
    }
}

fn main() {
    let user = api::User {
        id: 1,
        name: "Alice".to_string(),
        email: "alice@example.com".to_string(),
        password_hash: "hashed".to_string(),
        secret_token: "secret".to_string(),
    };

    let public = api::PublicProfile {
        user: user.clone().into(),
    };

    let admin = api::AdminView { user: user.into() };

    println!("Public: {:?}", public.user);
    println!("Admin: {:?}", admin.user);

    assert_eq!(public.user.id, 1);
    assert_eq!(admin.user.email, "alice@example.com");
}