pub trait VxTool: Send + Sync {
Show 17 methods
// Required methods
fn name(&self) -> &str;
fn fetch_versions<'life0, 'async_trait>(
&'life0 self,
include_prerelease: bool,
) -> Pin<Box<dyn Future<Output = Result<Vec<VersionInfo>>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
// Provided methods
fn description(&self) -> &str { ... }
fn aliases(&self) -> Vec<&str> { ... }
fn install_version<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
force: bool,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait { ... }
fn is_version_installed<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait { ... }
fn execute<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
args: &'life1 [String],
context: &'life2 ToolContext,
) -> Pin<Box<dyn Future<Output = Result<ToolExecutionResult>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn get_executable_path<'life0, 'life1, 'async_trait>(
&'life0 self,
install_dir: &'life1 Path,
) -> Pin<Box<dyn Future<Output = Result<PathBuf>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait { ... }
fn get_download_url<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<String>>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait { ... }
fn get_version_install_dir(&self, version: &str) -> PathBuf { ... }
fn get_base_install_dir(&self) -> PathBuf { ... }
fn get_active_version<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<String>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait { ... }
fn get_installed_versions<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<String>>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait { ... }
fn remove_version<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
force: bool,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait { ... }
fn get_status<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<ToolStatus>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait { ... }
fn default_install_workflow<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
version: &'life1 str,
install_dir: &'life2 Path,
) -> Pin<Box<dyn Future<Output = Result<PathBuf>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait { ... }
fn metadata(&self) -> HashMap<String, String> { ... }
}Expand description
Simplified trait for implementing tool support
This trait provides sensible defaults for most methods, so developers only need to implement the essential functionality for their specific tool.
§Required Methods
name(): Return the tool namefetch_versions(): Fetch available versions from the tool’s source
§Optional Methods
All other methods have default implementations that work for most tools, but can be overridden for custom behavior.
§Example
use vx_plugin::{VxTool, VersionInfo, Result};
use async_trait::async_trait;
struct MyTool;
#[async_trait]
impl VxTool for MyTool {
fn name(&self) -> &str {
"mytool"
}
async fn fetch_versions(&self, include_prerelease: bool) -> Result<Vec<VersionInfo>> {
// Fetch versions from your tool's API or registry
Ok(vec![
VersionInfo::new("1.0.0"),
VersionInfo::new("1.1.0"),
])
}
}Required Methods§
Sourcefn name(&self) -> &str
fn name(&self) -> &str
Tool name (required)
This should be a unique identifier for the tool, typically matching the executable name or common name used to invoke the tool.
Sourcefn fetch_versions<'life0, 'async_trait>(
&'life0 self,
include_prerelease: bool,
) -> Pin<Box<dyn Future<Output = Result<Vec<VersionInfo>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn fetch_versions<'life0, 'async_trait>(
&'life0 self,
include_prerelease: bool,
) -> Pin<Box<dyn Future<Output = Result<Vec<VersionInfo>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Fetch available versions from the tool’s official source
This is the main method developers need to implement. It should fetch version information from the tool’s official source (GitHub releases, package registry, etc.) and return a list of available versions.
§Arguments
include_prerelease- Whether to include prerelease/beta versions
§Returns
A vector of VersionInfo objects containing version details.
Provided Methods§
Sourcefn description(&self) -> &str
fn description(&self) -> &str
Tool description (optional, has default)
A human-readable description of what this tool does.
Sourcefn aliases(&self) -> Vec<&str>
fn aliases(&self) -> Vec<&str>
Supported aliases for this tool (optional)
Alternative names that can be used to refer to this tool. For example, “node” might have aliases like “nodejs”.
Sourcefn install_version<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
force: bool,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn install_version<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
force: bool,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Install a specific version of the tool
Default implementation provides a basic download-and-extract workflow that works for most tools. Override this method if your tool requires special installation procedures.
§Arguments
version- The version to installforce- Whether to force reinstallation if already installed
Sourcefn is_version_installed<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn is_version_installed<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Check if a version is installed
Default implementation checks for the existence of the tool’s executable in the standard vx path structure.
Sourcefn execute<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
args: &'life1 [String],
context: &'life2 ToolContext,
) -> Pin<Box<dyn Future<Output = Result<ToolExecutionResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn execute<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
args: &'life1 [String],
context: &'life2 ToolContext,
) -> Pin<Box<dyn Future<Output = Result<ToolExecutionResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Execute the tool with given arguments
Default implementation finds the tool executable and runs it with the provided arguments and context.
Sourcefn get_executable_path<'life0, 'life1, 'async_trait>(
&'life0 self,
install_dir: &'life1 Path,
) -> Pin<Box<dyn Future<Output = Result<PathBuf>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_executable_path<'life0, 'life1, 'async_trait>(
&'life0 self,
install_dir: &'life1 Path,
) -> Pin<Box<dyn Future<Output = Result<PathBuf>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Get the executable path within an installation directory
Override this if your tool has a non-standard layout. The default implementation uses the standard vx path structure.
Sourcefn get_download_url<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_download_url<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Get download URL for a specific version and current platform
Override this to provide platform-specific URLs. The default implementation tries to extract URLs from version info.
Sourcefn get_version_install_dir(&self, version: &str) -> PathBuf
fn get_version_install_dir(&self, version: &str) -> PathBuf
Get installation directory for a specific version
Returns the path where this version of the tool should be installed.
Uses the standard vx path structure: ~/.vx/tools/
Sourcefn get_base_install_dir(&self) -> PathBuf
fn get_base_install_dir(&self) -> PathBuf
Get base installation directory for this tool
Returns the base directory where all versions of this tool are installed.
Uses the standard vx path structure: ~/.vx/tools/
Sourcefn get_active_version<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<String>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_active_version<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<String>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Get the currently active version
Default implementation returns the latest installed version.
Sourcefn get_installed_versions<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_installed_versions<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Get all installed versions
Default implementation uses PathManager to scan for installed versions.
Sourcefn remove_version<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
force: bool,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn remove_version<'life0, 'life1, 'async_trait>(
&'life0 self,
version: &'life1 str,
force: bool,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Remove a specific version of the tool
Default implementation uses PathManager to remove the version.
Sourcefn get_status<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<ToolStatus>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_status<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<ToolStatus>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Get tool status (installed versions, active version, etc.)
Default implementation gathers status information from other methods.
Sourcefn default_install_workflow<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
version: &'life1 str,
install_dir: &'life2 Path,
) -> Pin<Box<dyn Future<Output = Result<PathBuf>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn default_install_workflow<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
version: &'life1 str,
install_dir: &'life2 Path,
) -> Pin<Box<dyn Future<Output = Result<PathBuf>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Default installation workflow (download + extract)
Most tools can use this as-is. This method handles the common pattern of downloading a tool from a URL and extracting it to the installation directory.