message_expression/message_expression.rs
1//! Dynamic validation messages with `messageExpression`.
2//!
3//! A CRD validation rule can carry a `messageExpression` — a CEL expression that
4//! produces the failure message at evaluation time, so the message can embed the
5//! offending value (mirroring the apiserver's `messageExpression` support). When
6//! present and it evaluates to a string, kube-cel uses it; otherwise it falls back
7//! to the static `message`.
8//!
9//! Run with: `cargo run --example message_expression --features validation`
10
11use kube_cel::Validator;
12use serde_json::json;
13
14fn main() {
15 let schema = json!({
16 "type": "object",
17 "properties": {
18 "spec": {
19 "type": "object",
20 "properties": {
21 "replicas": {"type": "integer"}
22 },
23 "x-kubernetes-validations": [{
24 "rule": "self.replicas <= 5",
25 // Static fallback, used if messageExpression is absent/non-string.
26 "message": "too many replicas",
27 // Dynamic message: embeds the actual value and the limit.
28 "messageExpression":
29 "'requested ' + string(self.replicas) + ' replicas, max allowed is 5'"
30 }]
31 }
32 }
33 });
34
35 let validator = Validator::new();
36
37 // Two invalid objects: the dynamic message differs per object.
38 for replicas in [8, 20] {
39 let object = json!({"spec": {"replicas": replicas}});
40 let errors = validator.validate(&schema, &object, None);
41 for err in &errors {
42 // Note the message reflects this object's value, not a fixed string.
43 println!("replicas={replicas}: {}", err.message);
44 }
45 }
46
47 // A valid object produces no errors (and so no message at all).
48 let ok = json!({"spec": {"replicas": 3}});
49 println!(
50 "replicas=3: {} error(s)",
51 validator.validate(&schema, &ok, None).len()
52 );
53}