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<T>
    where
        T: Clone + std::fmt::Debug,
    {
        pub id: u64,
        pub name: String,
        pub secret: String,
        pub metadata: T,
    }

    #[derive(Debug, Clone)]
    pub struct PublicUser<T>
    where
        T: Clone + std::fmt::Debug,
    {
        pub user: Omit!(User<T>, secret),
    }
}

#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
struct Metadata {
    role: String,
}

fn main() {
    let user = api::User {
        id: 42,
        name: "Alice".to_string(),
        secret: "hidden".to_string(),
        metadata: Metadata {
            role: "admin".to_string(),
        },
    };

    let public = api::PublicUser { user: user.into() };

    println!("Public: {:?}", public.user);
    assert_eq!(public.user.id, 42);
    assert_eq!(public.user.metadata.role, "admin");
}