guartcl 0.5.0

Enhanced Jim Tcl.
Documentation
//! typedata inspection commands
use std::rc::Rc;

use jimtcl::{Interp, JimObject, JimResult, custom::JimExtensionType};

use super::TypedData;

/// Get the type of a typed data structure.
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)
}

/// Get the length of a typed data structure.
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()),
    }
}

/// Convert a TypeData structure to native Tcl lists, dicts, and values.
pub fn td_native<'jim>(interp: &'jim Interp, obj: &JimObject<'jim>) -> JimResult<JimObject<'jim>> {
    let data = TypedData::extract_ref(obj)?;
    data.to_native(interp)
}

/// Select the first non-null TypeData from a sequence of TypeData.
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))
}