use certain_map::{certain_map, Param, ParamRef, ParamRemove, ParamSet, ParamTake};
#[derive(Clone)]
pub struct UserName(String);
#[derive(Copy, Clone)]
pub struct UserAge(u8);
certain_map! {
#[empty(MyCertainMapEmpty)]
#[full(MyCertainMapFull)]
#[style = "unfilled"]
#[derive(Clone)]
pub struct MyCertainMap {
name: UserName,
#[ensure(Clone)]
age: UserAge,
}
}
fn main() {
let meta = MyCertainMap::new();
assert_type::<MyCertainMapEmpty>(&meta);
let meta = meta.param_set(UserName("ihciah".to_string()));
log_username(&meta);
let (meta, removed) = ParamTake::<UserName>::param_take(meta);
assert_eq!(removed.0, "ihciah");
let meta = ParamRemove::<UserName>::param_remove(meta);
let meta = meta.param_set(UserAge(24));
log_age(&meta);
}
fn log_username<T: ParamRef<UserName>>(meta: &T) {
println!("username: {}", meta.param_ref().0);
}
fn log_age<T: Param<UserAge>>(meta: &T) {
println!("user age: {}", meta.param().0);
}
fn assert_type<T>(_: &T) {}