json_template/deserializer/
mod.rs1use serde::de::DeserializeOwned;
4use serde_json::{Map, Value};
5
6use crate::{Context, Placeholder, ToDeserializable, JSON};
7
8#[derive(Default, Clone, Copy)]
10pub struct Deserializer;
11
12impl Deserializer {
13 pub fn new() -> Self {
15 Self::default()
16 }
17
18 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 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 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 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 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 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 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 let value = self.resolve_value(&value, context)?;
94 Ok(value)
95 }
96}