Skip to main content

vtcode_tui/
options.rs

1use crate::config::KeyboardProtocolConfig;
2
3/// Standalone surface preference for selecting inline vs alternate rendering.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
5pub enum SessionSurface {
6    #[default]
7    Auto,
8    Alternate,
9    Inline,
10}
11
12impl From<SessionSurface> for crate::config::UiSurfacePreference {
13    fn from(value: SessionSurface) -> Self {
14        match value {
15            SessionSurface::Auto => Self::Auto,
16            SessionSurface::Alternate => Self::Alternate,
17            SessionSurface::Inline => Self::Inline,
18        }
19    }
20}
21
22impl From<crate::config::UiSurfacePreference> for SessionSurface {
23    fn from(value: crate::config::UiSurfacePreference) -> Self {
24        match value {
25            crate::config::UiSurfacePreference::Auto => Self::Auto,
26            crate::config::UiSurfacePreference::Alternate => Self::Alternate,
27            crate::config::UiSurfacePreference::Inline => Self::Inline,
28        }
29    }
30}
31
32/// Standalone keyboard protocol settings for terminal key event enhancements.
33#[derive(Debug, Clone, PartialEq, Eq)]
34pub struct KeyboardProtocolSettings {
35    pub enabled: bool,
36    pub mode: String,
37    pub disambiguate_escape_codes: bool,
38    pub report_event_types: bool,
39    pub report_alternate_keys: bool,
40    pub report_all_keys: bool,
41}
42
43impl Default for KeyboardProtocolSettings {
44    fn default() -> Self {
45        Self::from(KeyboardProtocolConfig::default())
46    }
47}
48
49impl From<KeyboardProtocolConfig> for KeyboardProtocolSettings {
50    fn from(value: KeyboardProtocolConfig) -> Self {
51        Self {
52            enabled: value.enabled,
53            mode: value.mode,
54            disambiguate_escape_codes: value.disambiguate_escape_codes,
55            report_event_types: value.report_event_types,
56            report_alternate_keys: value.report_alternate_keys,
57            report_all_keys: value.report_all_keys,
58        }
59    }
60}
61
62impl From<KeyboardProtocolSettings> for KeyboardProtocolConfig {
63    fn from(value: KeyboardProtocolSettings) -> Self {
64        Self {
65            enabled: value.enabled,
66            mode: value.mode,
67            disambiguate_escape_codes: value.disambiguate_escape_codes,
68            report_event_types: value.report_event_types,
69            report_alternate_keys: value.report_alternate_keys,
70            report_all_keys: value.report_all_keys,
71        }
72    }
73}
74
75#[cfg(test)]
76mod tests {
77    use super::*;
78
79    #[test]
80    fn session_surface_conversion_roundtrip() {
81        let variants = [
82            SessionSurface::Auto,
83            SessionSurface::Alternate,
84            SessionSurface::Inline,
85        ];
86
87        for variant in variants {
88            let converted: crate::config::UiSurfacePreference = variant.into();
89            let roundtrip = SessionSurface::from(converted);
90            assert_eq!(variant, roundtrip);
91        }
92    }
93
94    #[test]
95    fn keyboard_protocol_conversion_roundtrip() {
96        let settings = KeyboardProtocolSettings {
97            enabled: true,
98            mode: "custom".to_string(),
99            disambiguate_escape_codes: true,
100            report_event_types: false,
101            report_alternate_keys: true,
102            report_all_keys: false,
103        };
104
105        let config: KeyboardProtocolConfig = settings.clone().into();
106        let restored = KeyboardProtocolSettings::from(config);
107
108        assert_eq!(settings, restored);
109    }
110}