use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ValueDisplayMode {
Off,
#[default]
Minimal,
Milestones,
Verbose,
}
impl ValueDisplayMode {
pub fn parse(value: &str) -> Option<Self> {
match value.trim().to_ascii_lowercase().as_str() {
"off" | "0" | "false" | "none" => Some(Self::Off),
"minimal" | "on" | "1" | "true" => Some(Self::Minimal),
"milestones" => Some(Self::Milestones),
"verbose" => Some(Self::Verbose),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum StatuslineStyle {
#[default]
Brand,
Subtle,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct ValueDisplayConfig {
pub mode: ValueDisplayMode,
pub statusline: StatuslineStyle,
pub recap_every_turns: u32,
pub recap_min_tokens: u64,
pub notifications: bool,
pub git_trailer: bool,
}
impl Default for ValueDisplayConfig {
fn default() -> Self {
Self {
mode: ValueDisplayMode::default(),
statusline: StatuslineStyle::default(),
recap_every_turns: 5,
recap_min_tokens: 10_000,
notifications: true,
git_trailer: false,
}
}
}
impl ValueDisplayConfig {
pub fn effective_mode(&self) -> ValueDisplayMode {
std::env::var("LEAN_CTX_VALUE_DISPLAY")
.ok()
.and_then(|v| ValueDisplayMode::parse(&v))
.unwrap_or(self.mode)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_are_subtle_and_on() {
let cfg: ValueDisplayConfig = toml::from_str("").unwrap();
assert_eq!(cfg, ValueDisplayConfig::default());
assert_eq!(cfg.mode, ValueDisplayMode::Minimal);
assert!(!cfg.git_trailer);
}
#[test]
fn parses_toml_section() {
let cfg: ValueDisplayConfig =
toml::from_str("mode = \"off\"\nrecap_every_turns = 20").unwrap();
assert_eq!(cfg.mode, ValueDisplayMode::Off);
assert_eq!(cfg.recap_every_turns, 20);
assert_eq!(cfg.recap_min_tokens, 10_000);
assert_eq!(cfg.statusline, StatuslineStyle::Brand);
}
#[test]
fn statusline_style_parses() {
let cfg: ValueDisplayConfig = toml::from_str("statusline = \"subtle\"").unwrap();
assert_eq!(cfg.statusline, StatuslineStyle::Subtle);
assert!(toml::from_str::<ValueDisplayConfig>("statusline = \"loud\"").is_err());
}
#[test]
fn env_values_parse() {
assert_eq!(ValueDisplayMode::parse("OFF"), Some(ValueDisplayMode::Off));
assert_eq!(ValueDisplayMode::parse("0"), Some(ValueDisplayMode::Off));
assert_eq!(
ValueDisplayMode::parse("verbose"),
Some(ValueDisplayMode::Verbose)
);
assert_eq!(ValueDisplayMode::parse("loud"), None);
}
}