use std::marker::PhantomData;
use serde::{Deserialize, Serialize};
pub trait TemplateValidator: Send + Sync {
fn json_validate(&self, template: serde_json::Value) -> Result<ValidatedTemplateData, String>;
fn yaml_validate(&self, template: serde_yaml::Value) -> Result<ValidatedTemplateData, String>;
}
pub struct GenericValidator<T: for<'de> Deserialize<'de> + Send + Sync> {
marker: std::marker::PhantomData<T>,
}
impl<T: for<'de> Deserialize<'de> + Send + Sync> Default for GenericValidator<T> {
fn default() -> Self {
Self {
marker: PhantomData,
}
}
}
impl<T: for<'de> Deserialize<'de> + Serialize + Send + Sync> TemplateValidator
for GenericValidator<T>
{
fn json_validate(&self, template: serde_json::Value) -> Result<ValidatedTemplateData, String> {
serde_json::from_value::<T>(template.clone())
.map(|_| ())
.map_err(|e| e.to_string())?;
Ok(ValidatedTemplateData(template))
}
fn yaml_validate(&self, template: serde_yaml::Value) -> Result<ValidatedTemplateData, String> {
let obj = serde_yaml::from_value::<T>(template).map_err(|e| e.to_string())?;
Ok(ValidatedTemplateData(serde_json::to_value(&obj).unwrap()))
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidatedTemplateData(pub serde_json::Value);