json_template/deserializer/
mod.rs

1//! Deserializer module.
2
3use serde::de::DeserializeOwned;
4use serde_json::{Map, Value};
5
6use crate::{Context, Placeholder, ToDeserializable, JSON};
7
8/// A template.
9#[derive(Default, Clone, Copy)]
10pub struct Deserializer;
11
12impl Deserializer {
13    /// Create a new deserializer.
14    pub fn new() -> Self {
15        Self::default()
16    }
17
18    /// Deserialize .
19    pub fn deserialize<T: DeserializeOwned>(&self, value: impl ToDeserializable) -> serde_json::Result<T> {
20        let context = Context::new();
21        self.deserialize_with_context(value, &context)
22    }
23
24    /// Deserialize with context.
25    pub fn deserialize_with_context<T: DeserializeOwned>(&self, value: impl ToDeserializable, context: &Context) -> serde_json::Result<T> {
26        let mut context = context.clone();
27        let (directory, value) = value.to_deserializable()?;
28        if let (Some(directory), None) = (directory, context.directory()) {
29            context.set_directory(Some(directory));
30        }
31        context.set_current_data(value.clone());
32        let value = self.resolve_value(&value, &mut context)?;
33        Ok(serde_json::from_value(serde_json::Value::from(value))?)
34    }
35
36    /// Resolve an object.
37    pub fn resolve_object(&self, object: &Map<String, Value>, context: &Context) -> serde_json::Result<Value> {
38        let mut resolving_object = object.clone();
39        for value in resolving_object.values_mut() {
40            *value = self.resolve_value(value, context)?;
41        }
42        Ok(Value::Object(resolving_object))
43    }
44
45    /// Resolve a value.
46    pub fn resolve_value(&self, value: &Value, context: &Context) -> serde_json::Result<Value> {
47        let mut value = value.clone();
48        match &value {
49            Value::Object(object) => value = self.resolve_object(object, context)?,
50            Value::Array(array) => value = self.resolve_array(array, context)?,
51            Value::String(string) => value = self.resolve_string(string, context)?,
52            _ => {}
53        };
54        Ok(value)
55    }
56
57    /// Resolve a string.
58    pub fn resolve_string(&self, string: &str, context: &Context) -> serde_json::Result<Value> {
59        let placeholders = Placeholder::placeholders(string);
60        if placeholders.len() == 1 {
61            if placeholders[0].value == string {
62                return self.resolve_placeholder(&placeholders[0], context)
63            }
64        }
65        let string = placeholders.iter().fold(string.to_string(), |acc, placeholder| {
66            acc.replace(&placeholder.value, &self.resolve_placeholder(placeholder, context).unwrap().to_text())
67        });
68        Ok(Value::String(string))
69    }
70
71    /// Resolve array.
72    pub fn resolve_array(&self, array: &Vec<Value>, context: &Context) -> serde_json::Result<Value> {
73        let mut resolving_array = array.clone();
74        for value in resolving_array.iter_mut() {
75            *value = self.resolve_value(value, context)?;
76        }
77        Ok(Value::Array(resolving_array))
78    }
79    
80    /// Resolve the placeholder.
81    pub fn resolve_placeholder(&self, placeholder: &Placeholder, context: &Context) -> serde_json::Result<Value> {
82        let value = if let Some(type_) = placeholder.type_.as_ref() {
83            context
84                .functions()
85                .get(type_)
86                .ok_or_else(|| serde::de::Error::custom(format!("Function not found: {:?}", placeholder)))
87                .and_then(|function| function(self, context, placeholder))
88        } else {
89            context
90                .find(self, &placeholder)
91        }?;
92        // Resolve placeholders recursively
93        let value = self.resolve_value(&value, context)?;
94        Ok(value)
95    }
96}