nargo_template/
context.rs1#![warn(missing_docs)]
2
3use serde_json;
4
5pub trait TemplateContext: std::fmt::Debug + Clone + std::any::Any {
8 fn as_any(&self) -> &dyn std::any::Any;
10}
11
12pub trait ToJsonValue {
14 fn to_json_value(&self) -> serde_json::Value;
16}
17
18impl ToJsonValue for String {
19 fn to_json_value(&self) -> serde_json::Value {
20 serde_json::Value::String(self.clone())
21 }
22}
23
24impl ToJsonValue for &str {
25 fn to_json_value(&self) -> serde_json::Value {
26 serde_json::Value::String(self.to_string())
27 }
28}
29
30impl ToJsonValue for i64 {
31 fn to_json_value(&self) -> serde_json::Value {
32 serde_json::Value::Number(serde_json::Number::from(*self))
33 }
34}
35
36impl ToJsonValue for i32 {
37 fn to_json_value(&self) -> serde_json::Value {
38 serde_json::Value::Number(serde_json::Number::from(*self))
39 }
40}
41
42impl ToJsonValue for f64 {
43 fn to_json_value(&self) -> serde_json::Value {
44 serde_json::Value::Number(serde_json::Number::from_f64(*self).unwrap())
45 }
46}
47
48impl ToJsonValue for bool {
49 fn to_json_value(&self) -> serde_json::Value {
50 serde_json::Value::Bool(*self)
51 }
52}
53
54impl ToJsonValue for usize {
55 fn to_json_value(&self) -> serde_json::Value {
56 serde_json::Value::Number(serde_json::Number::from(*self))
57 }
58}
59
60impl<T: ToJsonValue> ToJsonValue for Vec<T> {
61 fn to_json_value(&self) -> serde_json::Value {
62 serde_json::Value::Array(self.iter().map(|v| v.to_json_value()).collect())
63 }
64}
65
66impl<K: ToJsonValue, V: ToJsonValue> ToJsonValue for std::collections::HashMap<K, V> {
67 fn to_json_value(&self) -> serde_json::Value {
68 let mut map = serde_json::Map::new();
69 for (k, v) in self {
70 if let serde_json::Value::String(key) = k.to_json_value() {
71 map.insert(key, v.to_json_value());
72 }
73 }
74 serde_json::Value::Object(map)
75 }
76}
77
78impl<T: ToJsonValue> ToJsonValue for Option<T> {
79 fn to_json_value(&self) -> serde_json::Value {
80 match self {
81 Some(v) => v.to_json_value(),
82 None => serde_json::Value::Null,
83 }
84 }
85}
86
87impl ToJsonValue for std::path::PathBuf {
88 fn to_json_value(&self) -> serde_json::Value {
89 serde_json::Value::String(self.to_string_lossy().to_string())
90 }
91}