mise_interactive_config/
providers.rs1use async_trait::async_trait;
7
8#[derive(Debug, Clone)]
10pub struct ToolInfo {
11 pub name: String,
13 pub description: Option<String>,
15 pub aliases: Vec<String>,
17}
18
19#[derive(Debug, Clone)]
21pub struct SettingInfo {
22 pub name: String,
24 pub description: Option<String>,
26 pub setting_type: SettingType,
28 pub default: Option<String>,
30}
31
32#[derive(Debug, Clone, PartialEq)]
34pub enum SettingType {
35 Bool,
37 Integer,
39 String,
41 StringArray,
43 Duration,
45 Path,
47 Enum(Vec<String>),
49}
50
51#[derive(Debug, Clone)]
53pub struct BackendInfo {
54 pub name: String,
56 pub description: Option<String>,
58}
59
60pub trait ToolProvider: Send + Sync {
62 fn list_tools(&self) -> Vec<ToolInfo>;
64}
65
66pub trait BackendProvider: Send + Sync {
68 fn list_backends(&self) -> Vec<BackendInfo>;
70}
71
72pub struct EmptyBackendProvider;
74
75impl BackendProvider for EmptyBackendProvider {
76 fn list_backends(&self) -> Vec<BackendInfo> {
77 Vec::new()
78 }
79}
80
81pub trait SettingProvider: Send + Sync {
83 fn list_settings(&self) -> Vec<SettingInfo>;
85}
86
87pub struct EmptyToolProvider;
89
90impl ToolProvider for EmptyToolProvider {
91 fn list_tools(&self) -> Vec<ToolInfo> {
92 Vec::new()
93 }
94}
95
96pub struct EmptySettingProvider;
98
99impl SettingProvider for EmptySettingProvider {
100 fn list_settings(&self) -> Vec<SettingInfo> {
101 Vec::new()
102 }
103}
104
105#[async_trait]
107pub trait VersionProvider: Send + Sync {
108 async fn latest_version(&self, tool: &str) -> Option<String>;
112}
113
114pub struct EmptyVersionProvider;
116
117#[async_trait]
118impl VersionProvider for EmptyVersionProvider {
119 async fn latest_version(&self, _tool: &str) -> Option<String> {
120 None
121 }
122}
123
124pub const VERSION_CUSTOM_MARKER: &str = "other...";
126
127pub fn version_variants(full_version: &str) -> Vec<String> {
131 let mut variants = vec!["latest".to_string()];
132
133 let parts: Vec<&str> = full_version.split('.').collect();
135
136 let mut current = String::new();
138 for (i, part) in parts.iter().enumerate() {
139 if i > 0 {
140 current.push('.');
141 }
142 current.push_str(part);
143 variants.push(current.clone());
144 }
145
146 variants.push(VERSION_CUSTOM_MARKER.to_string());
148
149 variants
150}