use serde_json::Value;
use crate::ops::GtsOps;
pub fn validate_traits_chain(chain: &[&Value]) -> Result<(), String> {
if chain.is_empty() {
return Err("validate_traits_chain: empty chain (no schemas to validate)".to_owned());
}
let mut ops = GtsOps::new(None, None, 0);
let last = chain.len().saturating_sub(1);
for (i, schema) in chain.iter().enumerate() {
let validate = i == last;
let result = ops.add_entity(schema, validate);
if !result.ok {
return Err(result.error);
}
}
Ok(())
}
pub fn validate_all(schemas: &[&Value]) -> Result<(), String> {
if schemas.is_empty() {
return Err("validate_all: empty schema set (nothing to validate)".to_owned());
}
let mut ops = GtsOps::new(None, None, 0);
for schema in schemas {
let result = ops.add_entity(schema, false);
if !result.ok {
return Err(result.error);
}
}
for schema in schemas {
let Some(id) = schema.get("$id").and_then(Value::as_str) else {
return Err("schema is missing a string `$id`".to_owned());
};
let gts_id = id.strip_prefix("gts://").unwrap_or(id);
let result = ops.validate_schema(gts_id);
if !result.ok {
return Err(format!("{gts_id}: {}", result.error));
}
}
Ok(())
}