Skip to main content

cersei_compression/
level.rs

1//! Compression level knob — consumed by the agent runner on every tool call.
2
3use serde::{Deserialize, Serialize};
4use std::fmt;
5use std::str::FromStr;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
8#[serde(rename_all = "lowercase")]
9pub enum CompressionLevel {
10    #[default]
11    Off,
12    Minimal,
13    Aggressive,
14}
15
16impl CompressionLevel {
17    pub fn is_off(&self) -> bool {
18        matches!(self, CompressionLevel::Off)
19    }
20}
21
22impl FromStr for CompressionLevel {
23    type Err = String;
24    fn from_str(s: &str) -> Result<Self, Self::Err> {
25        match s.trim().to_ascii_lowercase().as_str() {
26            "off" | "none" | "false" | "0" => Ok(CompressionLevel::Off),
27            "on" | "min" | "minimal" | "true" | "1" => Ok(CompressionLevel::Minimal),
28            "aggr" | "aggressive" | "max" => Ok(CompressionLevel::Aggressive),
29            other => Err(format!("unknown compression level: {other:?}")),
30        }
31    }
32}
33
34impl fmt::Display for CompressionLevel {
35    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36        match self {
37            CompressionLevel::Off => write!(f, "off"),
38            CompressionLevel::Minimal => write!(f, "minimal"),
39            CompressionLevel::Aggressive => write!(f, "aggressive"),
40        }
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47
48    #[test]
49    fn parse_aliases() {
50        assert_eq!("off".parse(), Ok(CompressionLevel::Off));
51        assert_eq!("on".parse(), Ok(CompressionLevel::Minimal));
52        assert_eq!("min".parse(), Ok(CompressionLevel::Minimal));
53        assert_eq!("aggressive".parse(), Ok(CompressionLevel::Aggressive));
54        assert_eq!("max".parse(), Ok(CompressionLevel::Aggressive));
55        assert!("bogus".parse::<CompressionLevel>().is_err());
56    }
57
58    #[test]
59    fn roundtrip_display() {
60        for lvl in [
61            CompressionLevel::Off,
62            CompressionLevel::Minimal,
63            CompressionLevel::Aggressive,
64        ] {
65            let s = lvl.to_string();
66            assert_eq!(s.parse::<CompressionLevel>().unwrap(), lvl);
67        }
68    }
69}