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