use crate::error::{ToolArgError, ToolArgIssue};
use serde_json::Value;
pub struct Validator {
validator: jsonschema::Validator,
}
impl Validator {
pub fn from_schema(schema: &Value) -> Result<Self, String> {
let validator = jsonschema::validator_for(schema).map_err(|e| e.to_string())?;
Ok(Self { validator })
}
pub fn validate(&self, args: &Value) -> Result<(), ToolArgError> {
let issues: Vec<ToolArgIssue> = self
.validator
.iter_errors(args)
.map(|err| {
let pointer = err.instance_path.to_string();
ToolArgIssue {
pointer,
message: err.to_string(),
}
})
.collect();
if issues.is_empty() {
Ok(())
} else {
Err(ToolArgError { issues })
}
}
pub fn is_valid(&self, args: &Value) -> bool {
self.validator.is_valid(args)
}
}