VxTool

Trait VxTool 

Source
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 name
  • fetch_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§

Source

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.

Source

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§

Source

fn description(&self) -> &str

Tool description (optional, has default)

A human-readable description of what this tool does.

Source

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”.

Source

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 install
  • force - Whether to force reinstallation if already installed
Source

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.

Source

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.

Source

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.

Source

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.

Source

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//

Source

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/

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

fn metadata(&self) -> HashMap<String, String>

Additional metadata for the tool (optional)

Override this to provide tool-specific metadata such as supported platforms, configuration options, etc.

Implementors§