use candid::{
CandidType, TypeEnv,
types::{Type, TypeInner, internal::TypeContainer},
};
use std::collections::HashSet;
pub fn variant(env: &TypeEnv, ty: &Type, name: &str) -> Option<Type> {
let ty = env.trace_type(ty).ok()?;
let TypeInner::Variant(fields) = ty.as_ref() else {
return None;
};
fields
.iter()
.find(|field| field.id.get_id() == candid::idl_hash(name))
.map(|field| field.ty.clone())
}
pub fn record(env: &TypeEnv, ty: &Type, name: &str) -> Option<Type> {
let ty = env.trace_type(ty).ok()?;
let TypeInner::Record(fields) = ty.as_ref() else {
return None;
};
fields
.iter()
.find(|field| field.id.get_id() == candid::idl_hash(name))
.map(|field| field.ty.clone())
}
pub fn equal<T: CandidType>(env: &mut TypeEnv, expected: &Type) -> Option<()> {
let mut rust = TypeContainer::new();
let ty = rust.add::<T>();
let actual = env.merge_type(rust.env, ty);
candid::types::subtype::equal(&mut HashSet::new(), env, expected, &actual).ok()
}