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(features: &[crate::terminal_setup::detector::TerminalFeature]) -> Result<String> {
12    let mut config_sections = Vec::new();
13
14    // Add header comment
15    config_sections.push("# VT Code Terminal Configuration for Tabby".to_string());
16    config_sections.push(String::new());
17
18    // Generate feature-specific configurations
19    for feature in features {
20        match feature {
21            crate::terminal_setup::detector::TerminalFeature::Multiline => {
22                config_sections.push("# Multiline input: Shift+Enter".to_string());
23                let multiline_config = multiline::generate_config(TerminalType::Tabby)?;
24                config_sections.push(multiline_config);
25            }
26            crate::terminal_setup::detector::TerminalFeature::CopyPaste => {
27                config_sections.push("# Enhanced copy/paste".to_string());
28                config_sections.push(
29                    r#"terminal:
30  copyOnSelect: true
31  pasteOnMiddleClick: true
32"#
33                    .to_string(),
34                );
35            }
36            crate::terminal_setup::detector::TerminalFeature::ShellIntegration => {
37                config_sections.push("# Shell integration".to_string());
38                config_sections.push(
39                    r#"terminal:
40  shellIntegration: true
41  workingDirectory: auto
42"#
43                    .to_string(),
44                );
45            }
46            crate::terminal_setup::detector::TerminalFeature::ThemeSync => {
47                config_sections.push("# Theme colors will be configured separately".to_string());
48                config_sections.push(String::new());
49            }
50            crate::terminal_setup::detector::TerminalFeature::Notifications => {
51                config_sections.push("# System notifications".to_string());
52                config_sections.push(
53                    r#"terminal:
54  bell: true
55  notifications:
56    enabled: true
57    shellIntegration: true
58"#
59                    .to_string(),
60                );
61            }
62        }
63    }
64
65    Ok(config_sections.join("\n"))
66}
67
68/// Merge Tabby configuration with existing YAML config file
69pub fn merge_with_existing(existing_content: &str, new_config: &str) -> Result<String> {
70    ConfigWriter::merge_with_markers(existing_content, new_config, ConfigFormat::Yaml)
71}
72
73#[cfg(test)]
74mod tests {
75    use super::*;
76    use crate::terminal_setup::detector::TerminalFeature;
77
78    #[test]
79    fn test_generate_multiline_config() {
80        let features = vec![TerminalFeature::Multiline];
81        let config = generate_config(&features).unwrap();
82        assert!(config.contains("Shift-Enter") || config.contains("Multiline"));
83    }
84
85    #[test]
86    fn test_generate_copy_paste_config() {
87        let features = vec![TerminalFeature::CopyPaste];
88        let config = generate_config(&features).unwrap();
89        assert!(config.contains("copyOnSelect"));
90    }
91}