Skip to main content

vtcode_config/
status_line.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
4#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
5#[derive(Default)]
6pub enum StatusLineMode {
7    /// Auto mode: displays git branch, model name, and context remaining (default)
8    #[default]
9    Auto,
10    /// Command mode: executes custom shell command to render status line
11    Command,
12    /// Hidden mode: disables the status line entirely
13    Hidden,
14}
15
16impl std::str::FromStr for StatusLineMode {
17    type Err = String;
18
19    fn from_str(s: &str) -> Result<Self, Self::Err> {
20        match s.trim().to_lowercase().as_str() {
21            "auto" => Ok(StatusLineMode::Auto),
22            "command" => Ok(StatusLineMode::Command),
23            "hidden" => Ok(StatusLineMode::Hidden),
24            _ => Err(format!("Invalid status line mode: {}", s)),
25        }
26    }
27}
28
29#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
30#[derive(Debug, Clone, Deserialize, Serialize)]
31pub struct StatusLineConfig {
32    #[serde(default = "default_status_line_mode")]
33    pub mode: StatusLineMode,
34    #[serde(default)]
35    pub command: Option<String>,
36    #[serde(default = "default_status_line_refresh_interval_ms")]
37    pub refresh_interval_ms: u64,
38    #[serde(default = "default_status_line_command_timeout_ms")]
39    pub command_timeout_ms: u64,
40}
41
42impl StatusLineConfig {
43    /// Get the effective status line mode, using defaults for unset values.
44    ///
45    /// Following Codex PR #12015's pattern for default configuration fallback,
46    /// this method ensures that when a status line config is not explicitly set,
47    /// sensible defaults are applied (Auto mode by default).
48    pub fn effective_mode(&self) -> StatusLineMode {
49        self.mode.clone()
50    }
51}
52
53impl Default for StatusLineConfig {
54    fn default() -> Self {
55        Self {
56            mode: default_status_line_mode(),
57            command: None,
58            refresh_interval_ms: default_status_line_refresh_interval_ms(),
59            command_timeout_ms: default_status_line_command_timeout_ms(),
60        }
61    }
62}
63
64/// Returns the default status line mode when not explicitly configured.
65///
66/// This is the fallback when `tui.status_line` config is unset (pattern from Codex PR #12015).
67pub const DEFAULT_STATUS_LINE_MODE: StatusLineMode = StatusLineMode::Auto;
68
69fn default_status_line_mode() -> StatusLineMode {
70    DEFAULT_STATUS_LINE_MODE
71}
72
73fn default_status_line_refresh_interval_ms() -> u64 {
74    crate::constants::ui::STATUS_LINE_REFRESH_INTERVAL_MS
75}
76
77fn default_status_line_command_timeout_ms() -> u64 {
78    crate::constants::ui::STATUS_LINE_COMMAND_TIMEOUT_MS
79}