use crate::Result;
use serde_json::Value;
pub struct SchemaValidator {
}
impl SchemaValidator {
pub fn new() -> Self {
Self {}
}
pub fn validate(&self, args: &Value, schema: &Value) -> Result<()> {
if let Some(expected_type) = schema.get("type").and_then(|t| t.as_str()) {
let actual_type = if args.is_string() {
"string"
} else if args.is_number() {
"number"
} else if args.is_boolean() {
"boolean"
} else if args.is_array() {
"array"
} else if args.is_object() {
"object"
} else {
"null"
};
if expected_type != actual_type {
return Err(crate::Error::SchemaValidationFailed(format!(
"Expected type '{}', got '{}'",
expected_type, actual_type
)));
}
}
if let Some(required) = schema.get("required").and_then(|r| r.as_array()) {
if let Some(obj) = args.as_object() {
for key in required {
if let Some(key_str) = key.as_str() {
if !obj.contains_key(key_str) {
return Err(crate::Error::SchemaValidationFailed(format!(
"Missing required field: '{}'",
key_str
)));
}
}
}
}
}
Ok(())
}
}
impl Default for SchemaValidator {
fn default() -> Self {
Self::new()
}
}