Skip to main content

vtcode_config/loader/
syntax_highlighting.rs

1use anyhow::{Result, ensure};
2use serde::{Deserialize, Serialize};
3
4use crate::defaults::{self, SyntaxHighlightingDefaults};
5
6/// Syntax highlighting configuration
7#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
8#[derive(Debug, Clone, Deserialize, Serialize)]
9pub struct SyntaxHighlightingConfig {
10    /// Enable syntax highlighting for tool output
11    #[serde(default = "defaults::syntax_highlighting::enabled")]
12    pub enabled: bool,
13
14    /// Theme to use for syntax highlighting
15    #[serde(default = "defaults::syntax_highlighting::theme")]
16    pub theme: String,
17
18    /// Enable theme caching for better performance
19    #[serde(default = "defaults::syntax_highlighting::cache_themes")]
20    pub cache_themes: bool,
21
22    /// Maximum file size for syntax highlighting (in MB)
23    #[serde(default = "defaults::syntax_highlighting::max_file_size_mb")]
24    pub max_file_size_mb: usize,
25
26    /// Languages to enable syntax highlighting for
27    #[serde(default = "defaults::syntax_highlighting::enabled_languages")]
28    pub enabled_languages: Vec<String>,
29
30    /// Performance settings - highlight timeout in milliseconds
31    #[serde(default = "defaults::syntax_highlighting::highlight_timeout_ms")]
32    pub highlight_timeout_ms: u64,
33}
34
35impl Default for SyntaxHighlightingConfig {
36    fn default() -> Self {
37        Self {
38            enabled: defaults::syntax_highlighting::enabled(),
39            theme: defaults::syntax_highlighting::theme(),
40            cache_themes: defaults::syntax_highlighting::cache_themes(),
41            max_file_size_mb: defaults::syntax_highlighting::max_file_size_mb(),
42            enabled_languages: defaults::syntax_highlighting::enabled_languages(),
43            highlight_timeout_ms: defaults::syntax_highlighting::highlight_timeout_ms(),
44        }
45    }
46}
47
48impl SyntaxHighlightingConfig {
49    pub fn validate(&self) -> Result<()> {
50        if !self.enabled {
51            return Ok(());
52        }
53
54        ensure!(
55            self.max_file_size_mb >= SyntaxHighlightingDefaults::min_file_size_mb(),
56            "Syntax highlighting max_file_size_mb must be at least {} MB",
57            SyntaxHighlightingDefaults::min_file_size_mb()
58        );
59
60        ensure!(
61            self.highlight_timeout_ms >= SyntaxHighlightingDefaults::min_highlight_timeout_ms(),
62            "Syntax highlighting highlight_timeout_ms must be at least {} ms",
63            SyntaxHighlightingDefaults::min_highlight_timeout_ms()
64        );
65
66        ensure!(
67            !self.theme.trim().is_empty(),
68            "Syntax highlighting theme must not be empty"
69        );
70
71        ensure!(
72            self.enabled_languages
73                .iter()
74                .all(|lang| !lang.trim().is_empty()),
75            "Syntax highlighting languages must not contain empty entries"
76        );
77
78        Ok(())
79    }
80}