nargo-template 0.0.1

Nargo template engine management
Documentation
#![warn(missing_docs)]

use serde_json;

/// 模板上下文 trait
/// 定义模板数据的统一接口
pub trait TemplateContext: std::fmt::Debug + Clone + std::any::Any {
    /// 转换为 Any 类型,用于类型检查
    fn as_any(&self) -> &dyn std::any::Any;
}

/// 将类型转换为 serde_json::Value 的 trait
pub trait ToJsonValue {
    /// 将自身转换为 serde_json::Value
    fn to_json_value(&self) -> serde_json::Value;
}

impl ToJsonValue for String {
    fn to_json_value(&self) -> serde_json::Value {
        serde_json::Value::String(self.clone())
    }
}

impl ToJsonValue for &str {
    fn to_json_value(&self) -> serde_json::Value {
        serde_json::Value::String(self.to_string())
    }
}

impl ToJsonValue for i64 {
    fn to_json_value(&self) -> serde_json::Value {
        serde_json::Value::Number(serde_json::Number::from(*self))
    }
}

impl ToJsonValue for i32 {
    fn to_json_value(&self) -> serde_json::Value {
        serde_json::Value::Number(serde_json::Number::from(*self))
    }
}

impl ToJsonValue for f64 {
    fn to_json_value(&self) -> serde_json::Value {
        serde_json::Value::Number(serde_json::Number::from_f64(*self).unwrap())
    }
}

impl ToJsonValue for bool {
    fn to_json_value(&self) -> serde_json::Value {
        serde_json::Value::Bool(*self)
    }
}

impl ToJsonValue for usize {
    fn to_json_value(&self) -> serde_json::Value {
        serde_json::Value::Number(serde_json::Number::from(*self))
    }
}

impl<T: ToJsonValue> ToJsonValue for Vec<T> {
    fn to_json_value(&self) -> serde_json::Value {
        serde_json::Value::Array(self.iter().map(|v| v.to_json_value()).collect())
    }
}

impl<K: ToJsonValue, V: ToJsonValue> ToJsonValue for std::collections::HashMap<K, V> {
    fn to_json_value(&self) -> serde_json::Value {
        let mut map = serde_json::Map::new();
        for (k, v) in self {
            if let serde_json::Value::String(key) = k.to_json_value() {
                map.insert(key, v.to_json_value());
            }
        }
        serde_json::Value::Object(map)
    }
}

impl<T: ToJsonValue> ToJsonValue for Option<T> {
    fn to_json_value(&self) -> serde_json::Value {
        match self {
            Some(v) => v.to_json_value(),
            None => serde_json::Value::Null,
        }
    }
}

impl ToJsonValue for std::path::PathBuf {
    fn to_json_value(&self) -> serde_json::Value {
        serde_json::Value::String(self.to_string_lossy().to_string())
    }
}