use cue_rs::{Ctx, Value, error::Error};
fn validate(
ctx: &Ctx,
schema: &Value,
data: &serde_json::Value,
) -> Result<(), Box<dyn std::error::Error>> {
let json_bytes = serde_json::to_vec(data)?;
let data_val = Value::compile_bytes(ctx, &json_bytes)?;
Value::unify(schema, &data_val).is_valid()?;
Ok(())
}
fn main() -> Result<(), Error> {
let ctx = Ctx::new()?;
let schema = Value::compile_string(&ctx, r"{ name: string, age: int & >=0 }")?;
let valid = serde_json::json!({ "name": "alice", "age": 30 });
match validate(&ctx, &schema, &valid) {
Ok(()) => println!("valid: {valid}"),
Err(e) => println!("unexpected failure: {e}"),
}
let invalid_age = serde_json::json!({ "name": "bob", "age": -1 });
match validate(&ctx, &schema, &invalid_age) {
Ok(()) => println!("unexpected success"),
Err(e) => println!("invalid: {invalid_age} ({e})"),
}
let invalid_type = serde_json::json!({ "name": 42, "age": 25 });
match validate(&ctx, &schema, &invalid_type) {
Ok(()) => println!("unexpected success"),
Err(e) => println!("invalid: {invalid_type} ({e})"),
}
Ok(())
}