vtcode_config/loader/
syntax_highlighting.rs1use anyhow::{Result, ensure};
2use serde::{Deserialize, Serialize};
3
4use crate::defaults::{self, SyntaxHighlightingDefaults};
5
6#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
8#[derive(Debug, Clone, Deserialize, Serialize)]
9pub struct SyntaxHighlightingConfig {
10 #[serde(default = "defaults::syntax_highlighting::enabled")]
12 pub enabled: bool,
13
14 #[serde(default = "defaults::syntax_highlighting::theme")]
16 pub theme: String,
17
18 #[serde(default = "defaults::syntax_highlighting::cache_themes")]
20 pub cache_themes: bool,
21
22 #[serde(default = "defaults::syntax_highlighting::max_file_size_mb")]
24 pub max_file_size_mb: usize,
25
26 #[serde(default = "defaults::syntax_highlighting::enabled_languages")]
28 pub enabled_languages: Vec<String>,
29
30 #[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}