Skip to main content

compiled_schema/
compiled_schema.rs

1//! Pre-compile a schema once, then validate many objects.
2//!
3//! Run with: `cargo run --example compiled_schema --features validation`
4
5use kube_cel::{compile_schema, validate_compiled};
6use serde_json::json;
7
8fn main() {
9    let schema = json!({
10        "type": "object",
11        "properties": {
12            "spec": {
13                "type": "object",
14                "x-kubernetes-validations": [{
15                    "rule": "self.replicas >= self.minReplicas",
16                    "message": "replicas must be >= minReplicas",
17                    "messageExpression": "'replicas is ' + string(self.replicas) + ' but minReplicas is ' + string(self.minReplicas)"
18                }],
19                "properties": {
20                    "replicas": {
21                        "type": "integer",
22                        "x-kubernetes-validations": [
23                            {"rule": "self >= 0", "message": "must be non-negative"}
24                        ]
25                    },
26                    "minReplicas": {"type": "integer"}
27                }
28            }
29        }
30    });
31
32    // Compile once
33    let compiled = compile_schema(&schema);
34    println!("Schema compiled successfully.\n");
35
36    // Validate many objects
37    let objects = [
38        json!({"spec": {"replicas": 3, "minReplicas": 1}}),
39        json!({"spec": {"replicas": -1, "minReplicas": 0}}),
40        json!({"spec": {"replicas": 1, "minReplicas": 5}}),
41        json!({"spec": {"replicas": 10, "minReplicas": 2}}),
42    ];
43
44    for (i, obj) in objects.iter().enumerate() {
45        let errors = validate_compiled(&compiled, obj, None);
46        let replicas = obj["spec"]["replicas"].as_i64().unwrap();
47        let min = obj["spec"]["minReplicas"].as_i64().unwrap();
48        if errors.is_empty() {
49            println!("Object {i}: replicas={replicas}, min={min} -> OK");
50        } else {
51            println!(
52                "Object {i}: replicas={replicas}, min={min} -> {} error(s)",
53                errors.len()
54            );
55            for err in &errors {
56                println!("  [{path}] {msg}", path = err.field_path, msg = err.message);
57            }
58        }
59    }
60}