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)]
#[derive(Clone)]
pub struct MyCertainMap {
name: UserName,
#[ensure(Clone)]
age: UserAge,
}
}
fn main() {
let mut store = MyCertainMap::new();
let meta = store.handler();
assert_type::<MyCertainMapEmpty>(&meta);
let meta = meta.param_set(UserName("ihciah".to_string()));
log_username(&meta);
let (mut store_forked, state_forked) = meta.fork();
let meta_forked = unsafe { state_forked.attach(&mut store_forked) };
let (meta, removed) = ParamTake::<UserName>::param_take(meta);
assert_eq!(removed.0, "ihciah");
log_username(&meta_forked);
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) {}