autonomic_core/
context.rs1use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
15#[serde(rename_all = "snake_case")]
16pub enum ContextRuling {
17 Breathe,
19 Dilate,
21 Compress,
23 Emergency,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct ContextCompressionAdvice {
33 pub ruling: ContextRuling,
35 pub pressure: f32,
37 pub target_tokens: Option<usize>,
39 pub rationale: String,
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46
47 #[test]
48 fn context_ruling_serde_roundtrip() {
49 for ruling in [
50 ContextRuling::Breathe,
51 ContextRuling::Dilate,
52 ContextRuling::Compress,
53 ContextRuling::Emergency,
54 ] {
55 let json = serde_json::to_string(&ruling).unwrap();
56 let back: ContextRuling = serde_json::from_str(&json).unwrap();
57 assert_eq!(ruling, back);
58 }
59 }
60
61 #[test]
62 fn context_compression_advice_serde_roundtrip() {
63 let advice = ContextCompressionAdvice {
64 ruling: ContextRuling::Dilate,
65 pressure: 0.68,
66 target_tokens: None,
67 rationale: "high tool density, quality stable".into(),
68 };
69 let json = serde_json::to_string(&advice).unwrap();
70 let back: ContextCompressionAdvice = serde_json::from_str(&json).unwrap();
71 assert_eq!(back.ruling, ContextRuling::Dilate);
72 assert!((back.pressure - 0.68).abs() < f32::EPSILON);
73 assert!(back.target_tokens.is_none());
74 }
75
76 #[test]
77 fn compress_advice_has_target() {
78 let advice = ContextCompressionAdvice {
79 ruling: ContextRuling::Compress,
80 pressure: 0.75,
81 target_tokens: Some(70_000),
82 rationale: "quality degrading".into(),
83 };
84 assert_eq!(advice.target_tokens, Some(70_000));
85 }
86}