intuicio_frontend_simpleton/library/
toml.rs

1use 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}