vtcode_config/
ide_context.rs1use 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")]
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}