vx_core/
config.rs

1//! Configuration management traits and types
2
3use crate::Result;
4use serde::{Deserialize, Serialize};
5use std::path::PathBuf;
6
7/// Trait for managing tool configuration
8pub trait ConfigManager: Send + Sync {
9    /// Get configuration for a specific tool
10    fn get_tool_config(&self, tool_name: &str) -> Result<Option<ToolConfig>>;
11
12    /// Set configuration for a specific tool
13    fn set_tool_config(&mut self, tool_name: &str, config: ToolConfig) -> Result<()>;
14
15    /// Get global configuration
16    fn get_global_config(&self) -> Result<GlobalConfig>;
17
18    /// Set global configuration
19    fn set_global_config(&mut self, config: GlobalConfig) -> Result<()>;
20
21    /// Save configuration to disk
22    fn save(&self) -> Result<()>;
23
24    /// Load configuration from disk
25    fn load(&mut self) -> Result<()>;
26
27    /// Get configuration file path
28    fn config_path(&self) -> PathBuf;
29}
30
31/// Configuration for a specific tool
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct ToolConfig {
34    /// Tool name
35    pub name: String,
36
37    /// Default version to use
38    pub default_version: Option<String>,
39
40    /// Download URLs for different versions
41    pub download_urls: std::collections::HashMap<String, String>,
42
43    /// Installation directory
44    pub install_dir: Option<PathBuf>,
45
46    /// Environment variables to set when using this tool
47    pub environment: std::collections::HashMap<String, String>,
48
49    /// Tool-specific settings
50    pub settings: std::collections::HashMap<String, serde_json::Value>,
51
52    /// Whether auto-installation is enabled
53    pub auto_install: bool,
54
55    /// Whether to check for updates automatically
56    pub auto_update: bool,
57}
58
59/// Global vx configuration
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct GlobalConfig {
62    /// Default installation directory
63    pub install_dir: PathBuf,
64
65    /// Cache directory
66    pub cache_dir: PathBuf,
67
68    /// Configuration directory
69    pub config_dir: PathBuf,
70
71    /// Whether to use system PATH as fallback
72    pub use_system_path: bool,
73
74    /// Default isolation level
75    pub isolation_level: crate::package_manager::IsolationLevel,
76
77    /// Proxy settings
78    pub proxy: Option<ProxyConfig>,
79
80    /// Update check settings
81    pub update_check: UpdateCheckConfig,
82
83    /// Telemetry settings
84    pub telemetry: TelemetryConfig,
85
86    /// Plugin settings
87    pub plugins: PluginConfig,
88}
89
90/// Proxy configuration
91#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct ProxyConfig {
93    pub http_proxy: Option<String>,
94    pub https_proxy: Option<String>,
95    pub no_proxy: Vec<String>,
96}
97
98/// Update check configuration
99#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct UpdateCheckConfig {
101    pub enabled: bool,
102    pub frequency: UpdateFrequency,
103    pub include_prerelease: bool,
104}
105
106/// Update check frequency
107#[derive(Debug, Clone, Serialize, Deserialize)]
108pub enum UpdateFrequency {
109    Never,
110    Daily,
111    Weekly,
112    Monthly,
113}
114
115/// Telemetry configuration
116#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct TelemetryConfig {
118    pub enabled: bool,
119    pub anonymous: bool,
120}
121
122/// Plugin configuration
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct PluginConfig {
125    pub enabled_plugins: Vec<String>,
126    pub plugin_dirs: Vec<PathBuf>,
127    pub auto_discover: bool,
128}
129
130impl Default for ToolConfig {
131    fn default() -> Self {
132        Self {
133            name: String::new(),
134            default_version: None,
135            download_urls: std::collections::HashMap::new(),
136            install_dir: None,
137            environment: std::collections::HashMap::new(),
138            settings: std::collections::HashMap::new(),
139            auto_install: true,
140            auto_update: false,
141        }
142    }
143}
144
145impl Default for GlobalConfig {
146    fn default() -> Self {
147        let home_dir = dirs::home_dir().unwrap_or_else(|| PathBuf::from("."));
148        let vx_dir = home_dir.join(".vx");
149
150        Self {
151            install_dir: vx_dir.join("tools"),
152            cache_dir: vx_dir.join("cache"),
153            config_dir: vx_dir.join("config"),
154            use_system_path: false,
155            isolation_level: crate::package_manager::IsolationLevel::Project,
156            proxy: None,
157            update_check: UpdateCheckConfig {
158                enabled: true,
159                frequency: UpdateFrequency::Weekly,
160                include_prerelease: false,
161            },
162            telemetry: TelemetryConfig {
163                enabled: false,
164                anonymous: true,
165            },
166            plugins: PluginConfig {
167                enabled_plugins: Vec::new(),
168                plugin_dirs: vec![vx_dir.join("plugins")],
169                auto_discover: true,
170            },
171        }
172    }
173}