compiled_schema/
compiled_schema.rs1use 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 let compiled = compile_schema(&schema);
34 println!("Schema compiled successfully.\n");
35
36 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}