// This file is generated by RustQ. Do not edit by hand.
fn get<'a>(term: Term<'a>, key: rustler::Atom) -> Option<Term<'a>> {
term.map_get(key).ok()
}
fn is_nil(term: Term) -> bool {
term.is_atom() && term.atom_to_string().ok().as_deref() == Some("nil")
}
fn opt<'a>(term: Term<'a>, key: rustler::Atom) -> Option<Term<'a>> {
get(term, key).filter(|t| !is_nil(*t))
}
fn str_val<'a>(term: Term<'a>, key: rustler::Atom) -> String {
match get(term, key) {
Some(t) => {
t.decode::<String>().or_else(|_| t.atom_to_string()).unwrap_or_default()
}
None => String::new(),
}
}
fn bool_val(term: Term, key: rustler::Atom) -> bool {
get(term, key).and_then(|t| t.decode::<bool>().ok()).unwrap_or(false)
}
fn f64_val(term: Term, key: rustler::Atom) -> f64 {
get(term, key)
.and_then(|t| {
t.decode::<f64>().ok().or_else(|| t.decode::<i64>().ok().map(|i| i as f64))
})
.unwrap_or(0.0)
}
fn list_val<'a>(term: Term<'a>, key: rustler::Atom) -> Vec<Term<'a>> {
get(term, key).and_then(|t| t.decode::<Vec<Term>>().ok()).unwrap_or_default()
}
fn type_atom(term: Term) -> Option<rustler::Atom> {
get(term, a::r#type()).and_then(|t| t.decode::<rustler::Atom>().ok())
}
fn type_eq(term: Term, expected: rustler::Atom) -> bool {
type_atom(term) == Some(expected)
}
fn type_str(term: Term) -> String {
get(term, a::r#type())
.and_then(|t| t.atom_to_string().ok())
.unwrap_or_else(|| "<no type>".into())
}