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}