Skip to main content

vtcode_core/terminal_setup/terminals/
windows_terminal.rs

1//! Windows Terminal configuration generator.
2//!
3//! Generates JSON configuration for Windows Terminal.
4
5use crate::terminal_setup::config_writer::{ConfigFormat, ConfigWriter};
6use crate::terminal_setup::detector::TerminalType;
7use crate::terminal_setup::features::multiline;
8use anyhow::Result;
9
10/// Generate complete Windows Terminal configuration with all features
11pub fn generate_config(
12    features: &[crate::terminal_setup::detector::TerminalFeature],
13) -> Result<String> {
14    let mut config_sections = Vec::new();
15
16    // Add header comment
17    config_sections.push("// VT Code Terminal Configuration for Windows Terminal".to_string());
18    config_sections.push(String::new());
19
20    // Generate feature-specific configurations
21    for feature in features {
22        match feature {
23            crate::terminal_setup::detector::TerminalFeature::Multiline => {
24                config_sections.push("// Multiline input: Shift+Enter".to_string());
25                let multiline_config = multiline::generate_config(TerminalType::WindowsTerminal)?;
26                config_sections.push(multiline_config);
27            }
28            crate::terminal_setup::detector::TerminalFeature::CopyPaste => {
29                config_sections.push("// Enhanced copy/paste".to_string());
30                config_sections.push(
31                    r#"{
32  "copyOnSelect": true,
33  "copyFormatting": false
34}
35"#
36                    .to_string(),
37                );
38            }
39            crate::terminal_setup::detector::TerminalFeature::ShellIntegration => {
40                config_sections.push("// Shell integration".to_string());
41                config_sections.push(
42                    r#"{
43  "experimental.rendering.forceFullRepaint": false,
44  "experimental.rendering.software": false
45}
46"#
47                    .to_string(),
48                );
49            }
50            crate::terminal_setup::detector::TerminalFeature::ThemeSync => {
51                config_sections.push("// Theme colors will be configured separately".to_string());
52                config_sections.push(String::new());
53            }
54            crate::terminal_setup::detector::TerminalFeature::Notifications => {
55                config_sections.push("// System notifications".to_string());
56                config_sections.push(
57                    r#"{
58  "bellStyle": "audible",
59  "bellDuration": 200,
60  "showTerminalBellAlert": true
61}
62"#
63                    .to_string(),
64                );
65            }
66        }
67    }
68
69    Ok(config_sections.join("\n"))
70}
71
72/// Merge Windows Terminal configuration with existing JSON config file
73pub fn merge_with_existing(existing_content: &str, new_config: &str) -> Result<String> {
74    ConfigWriter::merge_with_markers(existing_content, new_config, ConfigFormat::Json)
75}
76
77#[cfg(test)]
78mod tests {
79    use super::*;
80    use crate::terminal_setup::detector::TerminalFeature;
81
82    #[test]
83    fn test_generate_multiline_config() {
84        let features = vec![TerminalFeature::Multiline];
85        let config = generate_config(&features).unwrap();
86        assert!(config.contains("sendInput") || config.contains("shift+enter"));
87    }
88
89    #[test]
90    fn test_generate_copy_paste_config() {
91        let features = vec![TerminalFeature::CopyPaste];
92        let config = generate_config(&features).unwrap();
93        assert!(config.contains("copyOnSelect"));
94    }
95}