use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextRuling {
Breathe,
Dilate,
Compress,
Emergency,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContextCompressionAdvice {
pub ruling: ContextRuling,
pub pressure: f32,
pub target_tokens: Option<usize>,
pub rationale: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn context_ruling_serde_roundtrip() {
for ruling in [
ContextRuling::Breathe,
ContextRuling::Dilate,
ContextRuling::Compress,
ContextRuling::Emergency,
] {
let json = serde_json::to_string(&ruling).unwrap();
let back: ContextRuling = serde_json::from_str(&json).unwrap();
assert_eq!(ruling, back);
}
}
#[test]
fn context_compression_advice_serde_roundtrip() {
let advice = ContextCompressionAdvice {
ruling: ContextRuling::Dilate,
pressure: 0.68,
target_tokens: None,
rationale: "high tool density, quality stable".into(),
};
let json = serde_json::to_string(&advice).unwrap();
let back: ContextCompressionAdvice = serde_json::from_str(&json).unwrap();
assert_eq!(back.ruling, ContextRuling::Dilate);
assert!((back.pressure - 0.68).abs() < f32::EPSILON);
assert!(back.target_tokens.is_none());
}
#[test]
fn compress_advice_has_target() {
let advice = ContextCompressionAdvice {
ruling: ContextRuling::Compress,
pressure: 0.75,
target_tokens: Some(70_000),
rationale: "quality degrading".into(),
};
assert_eq!(advice.target_tokens, Some(70_000));
}
}