Skip to main content

vtcode_core/terminal_setup/terminals/
tabby.rs

1//! Tabby terminal configuration generator.
2//!
3//! Generates YAML configuration for Tabby 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 Tabby 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 Tabby".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::Tabby)?;
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#"terminal:
32  copyOnSelect: true
33  pasteOnMiddleClick: true
34"#
35                    .to_string(),
36                );
37            }
38            crate::terminal_setup::detector::TerminalFeature::ShellIntegration => {
39                config_sections.push("# Shell integration".to_string());
40                config_sections.push(
41                    r#"terminal:
42  shellIntegration: true
43  workingDirectory: auto
44"#
45                    .to_string(),
46                );
47            }
48            crate::terminal_setup::detector::TerminalFeature::ThemeSync => {
49                config_sections.push("# Theme colors will be configured separately".to_string());
50                config_sections.push(String::new());
51            }
52            crate::terminal_setup::detector::TerminalFeature::Notifications => {
53                config_sections.push("# System notifications".to_string());
54                config_sections.push(
55                    r#"terminal:
56  bell: true
57  notifications:
58    enabled: true
59    shellIntegration: true
60"#
61                    .to_string(),
62                );
63            }
64        }
65    }
66
67    Ok(config_sections.join("\n"))
68}
69
70/// Merge Tabby configuration with existing YAML config file
71pub fn merge_with_existing(existing_content: &str, new_config: &str) -> Result<String> {
72    ConfigWriter::merge_with_markers(existing_content, new_config, ConfigFormat::Yaml)
73}
74
75#[cfg(test)]
76mod tests {
77    use super::*;
78    use crate::terminal_setup::detector::TerminalFeature;
79
80    #[test]
81    fn test_generate_multiline_config() {
82        let features = vec![TerminalFeature::Multiline];
83        let config = generate_config(&features).unwrap();
84        assert!(config.contains("Shift-Enter") || config.contains("Multiline"));
85    }
86
87    #[test]
88    fn test_generate_copy_paste_config() {
89        let features = vec![TerminalFeature::CopyPaste];
90        let config = generate_config(&features).unwrap();
91        assert!(config.contains("copyOnSelect"));
92    }
93}