Skip to main content

vtcode_config/
ide_context.rs

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