use async_trait::async_trait;
#[derive(Debug, Clone)]
pub struct ToolInfo {
pub name: String,
pub description: Option<String>,
pub aliases: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct SettingInfo {
pub name: String,
pub description: Option<String>,
pub setting_type: SettingType,
pub default: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum SettingType {
Bool,
Integer,
String,
StringArray,
Duration,
Path,
Enum(Vec<String>),
}
#[derive(Debug, Clone)]
pub struct BackendInfo {
pub name: String,
pub description: Option<String>,
}
pub trait ToolProvider: Send + Sync {
fn list_tools(&self) -> Vec<ToolInfo>;
}
pub trait BackendProvider: Send + Sync {
fn list_backends(&self) -> Vec<BackendInfo>;
}
pub struct EmptyBackendProvider;
impl BackendProvider for EmptyBackendProvider {
fn list_backends(&self) -> Vec<BackendInfo> {
Vec::new()
}
}
pub trait SettingProvider: Send + Sync {
fn list_settings(&self) -> Vec<SettingInfo>;
}
pub struct EmptyToolProvider;
impl ToolProvider for EmptyToolProvider {
fn list_tools(&self) -> Vec<ToolInfo> {
Vec::new()
}
}
pub struct EmptySettingProvider;
impl SettingProvider for EmptySettingProvider {
fn list_settings(&self) -> Vec<SettingInfo> {
Vec::new()
}
}
#[async_trait]
pub trait VersionProvider: Send + Sync {
async fn latest_version(&self, tool: &str) -> Option<String>;
}
pub struct EmptyVersionProvider;
#[async_trait]
impl VersionProvider for EmptyVersionProvider {
async fn latest_version(&self, _tool: &str) -> Option<String> {
None
}
}
pub const VERSION_CUSTOM_MARKER: &str = "other...";
pub fn version_variants(full_version: &str) -> Vec<String> {
let mut variants = vec!["latest".to_string()];
let parts: Vec<&str> = full_version.split('.').collect();
let mut current = String::new();
for (i, part) in parts.iter().enumerate() {
if i > 0 {
current.push('.');
}
current.push_str(part);
variants.push(current.clone());
}
variants.push(VERSION_CUSTOM_MARKER.to_string());
variants
}