mod dump;
mod load;
mod string_cache;
pub(crate) use string_cache::JsonStringCache;
use super::ModuleFunctions;
use crate::{
args::ArgValues,
builtins::Builtins,
bytecode::VM,
exception_private::{ExcType, RunResult},
heap::{HeapData, HeapId},
intern::StaticStrings,
resource::{ResourceError, ResourceTracker},
types::Module,
value::Value,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, serde::Serialize, serde::Deserialize)]
#[strum(serialize_all = "lowercase")]
pub(crate) enum JsonFunctions {
Loads,
Dumps,
}
pub fn create_module(vm: &mut VM<'_, impl ResourceTracker>) -> Result<HeapId, ResourceError> {
let mut module = Module::new(StaticStrings::Json);
module.set_attr(
StaticStrings::Loads,
Value::ModuleFunction(ModuleFunctions::Json(JsonFunctions::Loads)),
vm,
);
module.set_attr(
StaticStrings::Dumps,
Value::ModuleFunction(ModuleFunctions::Json(JsonFunctions::Dumps)),
vm,
);
module.set_attr(
StaticStrings::JsonDecodeError,
Value::Builtin(Builtins::ExcType(ExcType::JsonDecodeError)),
vm,
);
vm.heap.allocate(HeapData::Module(module))
}
pub(super) fn call(
vm: &mut VM<'_, impl ResourceTracker>,
function: JsonFunctions,
args: ArgValues,
) -> RunResult<Value> {
match function {
JsonFunctions::Loads => load::call_loads(vm, args),
JsonFunctions::Dumps => dump::call_dumps(vm, args),
}
}