vtcode_config/
ide_context.rs1use 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 #[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}