use validator::ValidationError;
#[cfg(feature = "toolkits")]
pub fn validate_json_schema(parameters: &str) -> Result<(), ValidationError> {
let schema_json: serde_json::Value = serde_json::from_str(parameters).map_err(|e| {
ValidationError::new("invalid_json").with_message(std::borrow::Cow::Owned(format!(
"invalid JSON in schema: {e}"
)))
})?;
if jsonschema::validator_for(&schema_json).is_err() {
return Err(ValidationError::new("invalid_json_schema"));
}
Ok(())
}
#[cfg(not(feature = "toolkits"))]
pub fn validate_json_schema(parameters: &str) -> Result<(), ValidationError> {
let value: serde_json::Value =
serde_json::from_str(parameters).map_err(|_| ValidationError::new("invalid_json"))?;
validate_json_schema_value(&value)
}
#[cfg(feature = "toolkits")]
pub fn validate_json_schema_value(parameters: &serde_json::Value) -> Result<(), ValidationError> {
if jsonschema::validator_for(parameters).is_err() {
return Err(ValidationError::new("invalid_json_schema"));
}
Ok(())
}
#[cfg(not(feature = "toolkits"))]
pub fn validate_json_schema_value(parameters: &serde_json::Value) -> Result<(), ValidationError> {
if parameters.is_object() || parameters.is_boolean() {
Ok(())
} else {
Err(ValidationError::new("invalid_json_schema"))
}
}
#[cfg(all(test, feature = "toolkits"))]
mod tests {
use super::*;
#[test]
fn test_validate_json_schema_valid() {
let valid_schema = r#"
{
"type": "object",
"properties": {
"name": {
"type": "string"
}
},
"required": ["name"]
}
"#;
assert!(validate_json_schema(valid_schema).is_ok());
}
#[test]
fn test_validate_json_schema_invalid_json() {
let invalid_json = "{ invalid json }";
let result = validate_json_schema(invalid_json);
assert!(result.is_err());
}
#[test]
fn test_validate_json_schema_invalid_schema() {
let invalid_schema = r#"{"type": "invalid_type"}"#;
let result = validate_json_schema(invalid_schema);
assert!(result.is_err());
}
}
#[cfg(all(test, not(feature = "toolkits")))]
mod lightweight_tests {
use super::*;
#[test]
fn validates_json_and_top_level_schema_shape_without_optional_dependency() {
assert!(validate_json_schema(r#"{"type":"object"}"#).is_ok());
assert!(validate_json_schema("true").is_ok());
assert!(validate_json_schema("not json").is_err());
assert!(validate_json_schema("[]").is_err());
assert!(validate_json_schema("42").is_err());
}
}