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")]
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}