intuicio_frontend_simpleton/library/
toml.rs1use crate::{Array, Boolean, Integer, Map, Real, Reference, Text};
2use intuicio_core::registry::Registry;
3use intuicio_derive::intuicio_function;
4use toml::Value;
5
6fn to_value(value: &Reference) -> Value {
7 if let Some(value) = value.read::<Boolean>() {
8 Value::Boolean(*value)
9 } else if let Some(value) = value.read::<Integer>() {
10 Value::Integer(*value)
11 } else if let Some(value) = value.read::<Real>() {
12 Value::Float(*value)
13 } else if let Some(value) = value.read::<Text>() {
14 Value::String(value.to_owned())
15 } else if let Some(value) = value.read::<Array>() {
16 Value::Array(value.iter().map(to_value).collect())
17 } else if let Some(value) = value.read::<Map>() {
18 Value::Table(
19 value
20 .iter()
21 .map(|(key, value)| (key.to_owned(), to_value(value)))
22 .collect(),
23 )
24 } else {
25 panic!("Cannot serialize null!")
26 }
27}
28
29fn from_value(value: Value, registry: &Registry) -> Reference {
30 match value {
31 Value::String(value) => Reference::new_text(value, registry),
32 Value::Integer(value) => Reference::new_integer(value as Integer, registry),
33 Value::Float(value) => Reference::new_real(value, registry),
34 Value::Boolean(value) => Reference::new_boolean(value, registry),
35 Value::Datetime(_) => {
36 panic!("Cannot deserialize date time!");
37 }
38 Value::Array(value) => Reference::new_array(
39 value
40 .into_iter()
41 .map(|value| from_value(value, registry))
42 .collect(),
43 registry,
44 ),
45 Value::Table(value) => Reference::new_map(
46 value
47 .into_iter()
48 .map(|(key, value)| (key, from_value(value, registry)))
49 .collect(),
50 registry,
51 ),
52 }
53}
54
55#[intuicio_function(module_name = "toml", use_registry)]
56pub fn serialize(registry: &Registry, value: Reference) -> Reference {
57 Reference::new_text(toml::to_string(&to_value(&value)).unwrap(), registry)
58}
59
60#[intuicio_function(module_name = "toml", use_registry)]
61pub fn serialize_pretty(registry: &Registry, value: Reference) -> Reference {
62 Reference::new_text(toml::to_string_pretty(&to_value(&value)).unwrap(), registry)
63}
64
65#[intuicio_function(module_name = "toml", use_registry)]
66pub fn deserialize(registry: &Registry, text: Reference) -> Reference {
67 from_value(
68 toml::from_str::<Value>(text.read::<Text>().unwrap().as_str()).unwrap(),
69 registry,
70 )
71}
72
73pub fn install(registry: &mut Registry) {
74 registry.add_function(serialize::define_function(registry));
75 registry.add_function(serialize_pretty::define_function(registry));
76 registry.add_function(deserialize::define_function(registry));
77}