guartcl 0.3.0-beta1

Enhanced Jim Tcl.
Documentation
//! Parse command.

use jimtcl::{Interp, JimError, JimObject, JimResult};
use serde::de::DeserializeSeed;
use serde_json::de::SliceRead;

pub(crate) fn parse_json<'jim>(
    interp: &'jim Interp,
    args: &[JimObject<'jim>],
) -> JimResult<JimObject<'jim>> {
    if args.len() != 2 {
        return Err(JimError::from("usage: parse json <json>"));
    }

    let data = args[1].as_bytes();
    let read = SliceRead::new(data);
    let mut de = serde_json::Deserializer::new(read);
    let obj = interp.deserialize(&mut de).map_err(JimError::wrap)?;

    Ok(obj)
}

pub(crate) fn parse_toml<'jim>(
    interp: &'jim Interp,
    args: &[JimObject<'jim>],
) -> JimResult<JimObject<'jim>> {
    if args.len() != 2 {
        return Err(JimError::from("usage: parse json <json>"));
    }

    let data = args[1].as_str()?;
    let de = toml::Deserializer::parse(data).map_err(JimError::wrap)?;
    let obj = interp.deserialize(de).map_err(JimError::wrap)?;

    Ok(obj)
}

pub(crate) fn parse_yaml<'jim>(
    interp: &'jim Interp,
    args: &[JimObject<'jim>],
) -> JimResult<JimObject<'jim>> {
    if args.len() != 2 {
        return Err(JimError::from("usage: parse json <json>"));
    }

    let data = args[1].as_bytes();
    let de = yaml_serde::Deserializer::from_slice(data);
    let obj = interp.deserialize(de).map_err(JimError::wrap)?;

    Ok(obj)
}