Skip to main content

lean_ctx_protocol/
policy.rs

1use serde::{Deserialize, Serialize};
2
3/// Policy class — determines fail behavior on expiry.
4#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
5pub enum PolicyCriticality {
6    Critical,
7    High,
8    Medium,
9    Low,
10}
11
12#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13pub enum ExpiryBehavior {
14    FailClosed,
15    FailOpen,
16    GracePeriod,
17}
18
19/// Extended policy rule with classification.
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
21pub struct PolicyClassification {
22    pub criticality: PolicyCriticality,
23    pub expiry_behavior: ExpiryBehavior,
24    pub grace_period_seconds: u64,
25    #[serde(default, skip_serializing_if = "Option::is_none")]
26    pub fallback_policy_ref: Option<String>,
27    pub last_known_good_allowed: bool,
28}
29
30#[cfg(test)]
31mod tests {
32    use crate::{ExpiryBehavior, PolicyClassification, PolicyCriticality};
33
34    #[test]
35    fn serialization_round_trip() {
36        let classification = PolicyClassification {
37            criticality: PolicyCriticality::Critical,
38            expiry_behavior: ExpiryBehavior::FailClosed,
39            grace_period_seconds: 0,
40            fallback_policy_ref: None,
41            last_known_good_allowed: false,
42        };
43        let json = serde_json::to_string(&classification).expect("policy should serialize");
44        let decoded = serde_json::from_str(&json).expect("policy should deserialize");
45        assert_eq!(classification, decoded);
46    }
47}