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() {
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!();
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!();
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!();
let serialized_public = serde_json::to_string_pretty(&public_user).unwrap();
println!("Serialized Public User:");
println!("{}", serialized_public);
}