#![warn(missing_docs)]
use serde_json;
pub trait TemplateContext: std::fmt::Debug + Clone + std::any::Any {
fn as_any(&self) -> &dyn std::any::Any;
}
pub trait ToJsonValue {
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())
}
}