Skip to main content

vtcode_config/
ide_context.rs

1use serde::{Deserialize, Serialize};
2
3#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
4#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash, Default)]
5#[serde(rename_all = "snake_case")]
6pub enum IdeContextProviderFamily {
7    #[default]
8    VscodeCompatible,
9    Zed,
10    Generic,
11}
12
13#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
14#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash, Default)]
15#[serde(rename_all = "snake_case")]
16pub enum IdeContextProviderMode {
17    #[default]
18    Auto,
19    VscodeCompatible,
20    Zed,
21    Generic,
22}
23
24#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
25#[derive(Debug, Clone, Deserialize, Serialize)]
26pub struct IdeContextProviderConfig {
27    #[serde(default = "default_provider_enabled")]
28    pub enabled: bool,
29}
30
31impl Default for IdeContextProviderConfig {
32    fn default() -> Self {
33        Self {
34            enabled: default_provider_enabled(),
35        }
36    }
37}
38
39#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
40#[derive(Debug, Clone, Deserialize, Serialize, Default)]
41pub struct IdeContextProvidersConfig {
42    #[serde(default)]
43    pub vscode_compatible: IdeContextProviderConfig,
44    #[serde(default)]
45    pub zed: IdeContextProviderConfig,
46    #[serde(default)]
47    pub generic: IdeContextProviderConfig,
48}
49
50#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
51#[derive(Debug, Clone, Deserialize, Serialize)]
52pub struct IdeContextConfig {
53    #[serde(default = "default_enabled")]
54    pub enabled: bool,
55    #[serde(default = "default_inject_into_prompt")]
56    pub inject_into_prompt: bool,
57    #[serde(default = "default_show_in_tui")]
58    pub show_in_tui: bool,
59    #[serde(default = "default_include_selection_text")]
60    pub include_selection_text: bool,
61    #[serde(default)]
62    pub provider_mode: IdeContextProviderMode,
63    #[serde(default)]
64    pub providers: IdeContextProvidersConfig,
65}
66
67impl IdeContextConfig {
68    pub fn provider_enabled(&self, family: IdeContextProviderFamily) -> bool {
69        match family {
70            IdeContextProviderFamily::VscodeCompatible => self.providers.vscode_compatible.enabled,
71            IdeContextProviderFamily::Zed => self.providers.zed.enabled,
72            IdeContextProviderFamily::Generic => self.providers.generic.enabled,
73        }
74    }
75
76    pub fn allows_provider_family(&self, family: IdeContextProviderFamily) -> bool {
77        if !self.enabled || !self.provider_enabled(family) {
78            return false;
79        }
80
81        match self.provider_mode {
82            IdeContextProviderMode::Auto => true,
83            IdeContextProviderMode::VscodeCompatible => {
84                family == IdeContextProviderFamily::VscodeCompatible
85            }
86            IdeContextProviderMode::Zed => family == IdeContextProviderFamily::Zed,
87            IdeContextProviderMode::Generic => family == IdeContextProviderFamily::Generic,
88        }
89    }
90}
91
92impl Default for IdeContextConfig {
93    fn default() -> Self {
94        Self {
95            enabled: default_enabled(),
96            inject_into_prompt: default_inject_into_prompt(),
97            show_in_tui: default_show_in_tui(),
98            include_selection_text: default_include_selection_text(),
99            provider_mode: IdeContextProviderMode::default(),
100            providers: IdeContextProvidersConfig::default(),
101        }
102    }
103}
104
105const fn default_enabled() -> bool {
106    true
107}
108
109const fn default_provider_enabled() -> bool {
110    true
111}
112
113const fn default_inject_into_prompt() -> bool {
114    true
115}
116
117const fn default_show_in_tui() -> bool {
118    true
119}
120
121const fn default_include_selection_text() -> bool {
122    true
123}
124
125#[cfg(test)]
126mod tests {
127    use super::{
128        IdeContextConfig, IdeContextProviderFamily, IdeContextProviderMode,
129        IdeContextProvidersConfig,
130    };
131
132    #[test]
133    fn default_config_allows_enabled_providers_in_auto_mode() {
134        let config = IdeContextConfig::default();
135        assert!(config.allows_provider_family(IdeContextProviderFamily::VscodeCompatible));
136        assert!(config.allows_provider_family(IdeContextProviderFamily::Zed));
137        assert!(config.allows_provider_family(IdeContextProviderFamily::Generic));
138    }
139
140    #[test]
141    fn provider_mode_filters_other_families() {
142        let config = IdeContextConfig {
143            provider_mode: IdeContextProviderMode::Zed,
144            ..IdeContextConfig::default()
145        };
146        assert!(!config.allows_provider_family(IdeContextProviderFamily::VscodeCompatible));
147        assert!(config.allows_provider_family(IdeContextProviderFamily::Zed));
148    }
149
150    #[test]
151    fn disabled_provider_family_is_rejected() {
152        let config = IdeContextConfig {
153            providers: IdeContextProvidersConfig {
154                generic: super::IdeContextProviderConfig { enabled: false },
155                ..IdeContextProvidersConfig::default()
156            },
157            ..IdeContextConfig::default()
158        };
159        assert!(!config.allows_provider_family(IdeContextProviderFamily::Generic));
160    }
161}