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    /// Inject active editor context into request-time model input.
56    #[serde(default = "default_inject_into_prompt")]
57    pub inject_into_prompt: bool,
58    #[serde(default = "default_show_in_tui")]
59    pub show_in_tui: bool,
60    #[serde(default = "default_include_selection_text")]
61    pub include_selection_text: bool,
62    #[serde(default)]
63    pub provider_mode: IdeContextProviderMode,
64    #[serde(default)]
65    pub providers: IdeContextProvidersConfig,
66}
67
68impl IdeContextConfig {
69    pub fn provider_enabled(&self, family: IdeContextProviderFamily) -> bool {
70        match family {
71            IdeContextProviderFamily::VscodeCompatible => self.providers.vscode_compatible.enabled,
72            IdeContextProviderFamily::Zed => self.providers.zed.enabled,
73            IdeContextProviderFamily::Generic => self.providers.generic.enabled,
74        }
75    }
76
77    pub fn allows_provider_family(&self, family: IdeContextProviderFamily) -> bool {
78        if !self.enabled || !self.provider_enabled(family) {
79            return false;
80        }
81
82        match self.provider_mode {
83            IdeContextProviderMode::Auto => true,
84            IdeContextProviderMode::VscodeCompatible => {
85                family == IdeContextProviderFamily::VscodeCompatible
86            }
87            IdeContextProviderMode::Zed => family == IdeContextProviderFamily::Zed,
88            IdeContextProviderMode::Generic => family == IdeContextProviderFamily::Generic,
89        }
90    }
91}
92
93impl Default for IdeContextConfig {
94    fn default() -> Self {
95        Self {
96            enabled: default_enabled(),
97            inject_into_prompt: default_inject_into_prompt(),
98            show_in_tui: default_show_in_tui(),
99            include_selection_text: default_include_selection_text(),
100            provider_mode: IdeContextProviderMode::default(),
101            providers: IdeContextProvidersConfig::default(),
102        }
103    }
104}
105
106const fn default_enabled() -> bool {
107    true
108}
109
110const fn default_provider_enabled() -> bool {
111    true
112}
113
114const fn default_inject_into_prompt() -> bool {
115    true
116}
117
118const fn default_show_in_tui() -> bool {
119    true
120}
121
122const fn default_include_selection_text() -> bool {
123    true
124}
125
126#[cfg(test)]
127mod tests {
128    use super::{
129        IdeContextConfig, IdeContextProviderFamily, IdeContextProviderMode,
130        IdeContextProvidersConfig,
131    };
132
133    #[test]
134    fn default_config_allows_enabled_providers_in_auto_mode() {
135        let config = IdeContextConfig::default();
136        assert!(config.allows_provider_family(IdeContextProviderFamily::VscodeCompatible));
137        assert!(config.allows_provider_family(IdeContextProviderFamily::Zed));
138        assert!(config.allows_provider_family(IdeContextProviderFamily::Generic));
139    }
140
141    #[test]
142    fn provider_mode_filters_other_families() {
143        let config = IdeContextConfig {
144            provider_mode: IdeContextProviderMode::Zed,
145            ..IdeContextConfig::default()
146        };
147        assert!(!config.allows_provider_family(IdeContextProviderFamily::VscodeCompatible));
148        assert!(config.allows_provider_family(IdeContextProviderFamily::Zed));
149    }
150
151    #[test]
152    fn disabled_provider_family_is_rejected() {
153        let config = IdeContextConfig {
154            providers: IdeContextProvidersConfig {
155                generic: super::IdeContextProviderConfig { enabled: false },
156                ..IdeContextProvidersConfig::default()
157            },
158            ..IdeContextConfig::default()
159        };
160        assert!(!config.allows_provider_family(IdeContextProviderFamily::Generic));
161    }
162}