use std::rc::Rc;
use jimtcl::{Interp, JimObject, JimResult, custom::JimExtensionType};
use super::TypedData;
pub fn td_type<'jim>(_interp: &'jim Interp, obj: &JimObject<'jim>) -> JimResult<&'static str> {
let td = TypedData::extract_ref(obj)?;
let t = match td {
TypedData::Null => "null",
TypedData::Bool(_) => "boolean",
TypedData::Int(_) => "int",
TypedData::Float(_) => "float",
TypedData::Str(_) => "string",
TypedData::List(_) => "list",
TypedData::Record(_) => "record",
};
Ok(t)
}
pub fn td_length<'jim>(_interp: &'jim Interp, obj: &JimObject<'jim>) -> JimResult<usize> {
let td = TypedData::extract_ref(obj)?;
match td {
TypedData::Str(s) => Ok(s.len()),
TypedData::List(l) => Ok(l.len()),
TypedData::Record(o) => Ok(o.len()),
bad => Err(format!("data {:?} has no length", bad).into()),
}
}
pub fn td_native<'jim>(interp: &'jim Interp, obj: &JimObject<'jim>) -> JimResult<JimObject<'jim>> {
let data = TypedData::extract_ref(obj)?;
data.to_native(interp)
}
pub fn td_coalesce<'jim>(
_interp: &'jim Interp,
args: &[JimObject<'jim>],
) -> JimResult<Rc<TypedData>> {
for arg in &args[1..] {
let td = TypedData::extract(arg)?;
if !td.is_null() {
return Ok(td);
}
}
Ok(Rc::new(TypedData::Null))
}