use crate::{AgentError, Result};
use serde::de::DeserializeOwned;
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub enum Validator {
SerdeFirst,
Strict(StrictValidator),
}
impl Validator {
pub fn validate<T: DeserializeOwned>(&self, params: Value) -> Result<T> {
match self {
Validator::SerdeFirst => serde_first_validate(params),
Validator::Strict(validator) => validator.validate(params),
}
}
}
fn serde_first_validate<T: DeserializeOwned>(params: Value) -> Result<T> {
serde_path_to_error::deserialize(params).map_err(|e| {
AgentError::Validation(format!(
"Parameter validation failed at {}: {}",
e.path(),
e
))
})
}
#[derive(Debug, Clone)]
pub struct StrictValidator {
schemas: HashMap<String, Value>,
}
impl StrictValidator {
pub fn new() -> Self {
Self {
schemas: HashMap::new(),
}
}
pub fn register_schema(&mut self, tool_name: &str, schema: Value) {
self.schemas.insert(tool_name.to_string(), schema);
}
pub fn validate<T: DeserializeOwned>(&self, params: Value) -> Result<T> {
serde_first_validate(params)
}
}
impl Default for StrictValidator {
fn default() -> Self {
Self::new()
}
}