Skip to main content

mruby_serde_json/
lib.rs

1pub mod json_value;
2
3use std::rc::Rc;
4
5use mrubyedge::{
6    Error,
7    yamrb::{helpers::mrb_define_class_cmethod, value::RObject, vm::VM},
8};
9
10pub fn init_json(vm: &mut VM) {
11    let json_class = vm.define_class("JSON", None, None);
12
13    mrb_define_class_cmethod(
14        vm,
15        json_class.clone(),
16        "dump",
17        Box::new(mrb_json_class_dump),
18    );
19    mrb_define_class_cmethod(
20        vm,
21        json_class.clone(),
22        "generate",
23        Box::new(mrb_json_class_dump),
24    );
25    mrb_define_class_cmethod(
26        vm,
27        json_class.clone(),
28        "load",
29        Box::new(mrb_json_class_load),
30    );
31    mrb_define_class_cmethod(
32        vm,
33        json_class.clone(),
34        "parse",
35        Box::new(mrb_json_class_load),
36    );
37}
38
39pub fn mrb_json_class_dump(vm: &mut VM, args: &[Rc<RObject>]) -> Result<Rc<RObject>, Error> {
40    let args = if args[args.len() - 1].is_nil() {
41        &args[0..args.len() - 1]
42    } else {
43        args
44    };
45    if args.len() != 1 {
46        return Err(Error::ArgumentError(
47            "wrong number of arguments".to_string(),
48        ));
49    }
50    let result = json_value::mrb_json_dump(vm, args[0].clone())?;
51    Ok(result)
52}
53
54pub fn mrb_json_class_load(vm: &mut VM, args: &[Rc<RObject>]) -> Result<Rc<RObject>, Error> {
55    let args = if args[args.len() - 1].is_nil() {
56        &args[0..args.len() - 1]
57    } else {
58        args
59    };
60    if args.len() != 1 {
61        return Err(Error::ArgumentError(
62            "wrong number of arguments".to_string(),
63        ));
64    }
65    let json_str: String = args[0].as_ref().try_into()?;
66    let result = json_value::mrb_json_load(vm, json_str)?;
67    Ok(result.get_inner())
68}