use crate::error::StorageError;
use auths_verifier::core::Attestation;
use jsonschema;
use serde_json::{Value, to_vec_pretty};
#[derive(Clone, Debug)]
pub struct JsonSchemaValidatingEncoder {
schema_value: Value,
}
impl JsonSchemaValidatingEncoder {
pub fn new(schema_value: Value) -> Self {
Self { schema_value }
}
pub fn encode(&self, att: &Attestation) -> Result<Vec<u8>, StorageError> {
if let Some(payload_value) = &att.payload
&& !jsonschema::is_valid(&self.schema_value, payload_value)
{
let error_details = match jsonschema::validate(&self.schema_value, payload_value) {
Ok(_) => "Unknown validation error".to_string(),
Err(validation_error) => {
format!(
"Path '/payload{}': {:?}",
validation_error.instance_path(),
validation_error.kind()
)
}
};
return Err(StorageError::SchemaValidation(error_details));
}
Ok(to_vec_pretty(att)?)
}
}