Skip to main content

nargo_template/
context.rs

1#![warn(missing_docs)]
2
3use serde_json;
4
5/// 模板上下文 trait
6/// 定义模板数据的统一接口
7pub trait TemplateContext: std::fmt::Debug + Clone + std::any::Any {
8    /// 转换为 Any 类型,用于类型检查
9    fn as_any(&self) -> &dyn std::any::Any;
10}
11
12/// 将类型转换为 serde_json::Value 的 trait
13pub trait ToJsonValue {
14    /// 将自身转换为 serde_json::Value
15    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}