use std::error::Error;
use kube_cel::{ErrorKind, Validator};
use serde_json::json;
fn main() {
let schema = json!({
"type": "object",
"x-kubernetes-validations": [
{"rule": "self.replicas >= 1", "message": "replicas must be at least 1"},
{"rule": "self.maxSurge > 0", "message": "maxSurge must be positive"},
{"rule": "self.zones.sortBy(z, z) == self.zones", "message": "zones must be sorted"}
],
"properties": {
"replicas": {"type": "integer"},
"zones": {"type": "array", "items": {"type": "string"}}
}
});
let object = json!({"replicas": 0, "zones": ["b", "a"]});
let errors = Validator::new().validate(&schema, &object, None);
println!("{} validation error(s)\n", errors.len());
for err in &errors {
println!("rule: {}", err.rule);
println!(" kind: {:?}", err.kind);
println!(" message: {err}");
match err.kind {
ErrorKind::ValidationFailure => {
println!(" -> the object violated the rule; reject it");
}
ErrorKind::EvaluationError => {
println!(" -> the rule failed at runtime; likely a malformed object");
}
ErrorKind::UnsupportedReference => {
println!(" -> coverage gap: this kube-cel build can't evaluate the rule");
}
_ => println!(" -> other ({:?})", err.kind),
}
let mut cause = err.source();
if cause.is_none() {
println!(" (no underlying cause)");
}
let mut depth = 1;
while let Some(e) = cause {
println!(" {:indent$}caused by: {e}", "", indent = depth * 2);
cause = e.source();
depth += 1;
}
println!();
}
}