guartcl 0.6.0-alpha1

Enhanced Jim Tcl.
Documentation
use std::fs::File;

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

pub(crate) fn parse_json<'jim>(
    interp: &'jim Interp,
    args: &[JimObject<'jim>],
) -> JimResult<JimObject<'jim>> {
    let mut parser = ProcArgParser::new();
    parser.add_flag("-file");
    parser.add_required_arg("input");
    let args = parser.parse(interp, args)?;
    let src = args.require_arg("input")?;

    if args.get_flag("-file") {
        src.require_untainted("path")?;
        let open = File::open(src.as_str()?)?;
        let read = IoRead::new(open);
        json_from_input(interp, read)
    } else {
        let data = src.as_bytes();
        let read = SliceRead::new(data);
        json_from_input(interp, read)
    }
}

fn json_from_input<'jim, 'r, R: serde_json::de::Read<'r>>(
    interp: &'jim Interp,
    read: R,
) -> JimResult<JimObject<'jim>> {
    let mut de = serde_json::Deserializer::new(read);
    interp.deserialize(&mut de).map_err(JimError::wrap)
}