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");
}