mruby-serde-json 0.1.0

mruby-serde-json provides JSON serialization/deserialization for mruby/edge using serde_json
Documentation
pub mod json_value;

use std::rc::Rc;

use mrubyedge::{
    Error,
    yamrb::{helpers::mrb_define_class_cmethod, value::RObject, vm::VM},
};

pub fn init_json(vm: &mut VM) {
    let json_class = vm.define_class("JSON", None, None);

    mrb_define_class_cmethod(
        vm,
        json_class.clone(),
        "dump",
        Box::new(mrb_json_class_dump),
    );
    mrb_define_class_cmethod(
        vm,
        json_class.clone(),
        "generate",
        Box::new(mrb_json_class_dump),
    );
    mrb_define_class_cmethod(
        vm,
        json_class.clone(),
        "load",
        Box::new(mrb_json_class_load),
    );
    mrb_define_class_cmethod(
        vm,
        json_class.clone(),
        "parse",
        Box::new(mrb_json_class_load),
    );
}

pub fn mrb_json_class_dump(vm: &mut VM, args: &[Rc<RObject>]) -> Result<Rc<RObject>, Error> {
    let args = if args[args.len() - 1].is_nil() {
        &args[0..args.len() - 1]
    } else {
        args
    };
    if args.len() != 1 {
        return Err(Error::ArgumentError(
            "wrong number of arguments".to_string(),
        ));
    }
    let result = json_value::mrb_json_dump(vm, args[0].clone())?;
    Ok(result)
}

pub fn mrb_json_class_load(vm: &mut VM, args: &[Rc<RObject>]) -> Result<Rc<RObject>, Error> {
    let args = if args[args.len() - 1].is_nil() {
        &args[0..args.len() - 1]
    } else {
        args
    };
    if args.len() != 1 {
        return Err(Error::ArgumentError(
            "wrong number of arguments".to_string(),
        ));
    }
    let json_str: String = args[0].as_ref().try_into()?;
    let result = json_value::mrb_json_load(vm, json_str)?;
    Ok(result.get_inner())
}