tool-sync 0.2.0

tool-sync is a CLI tool that manages installation of other CLI tools from GitHub Releases by downloading binaries and storing them in a local directory.
Documentation
mod archive;
mod configure;
pub mod db;
mod download;
mod install;
mod prefetch;
mod progress;

use console::Emoji;
use std::path::PathBuf;

use crate::config::schema::Config;
use crate::config::toml;

use self::install::Installer;
use self::prefetch::prefetch;
use self::progress::SyncProgress;
use self::progress::ToolPair;

pub fn sync_from_path(config_path: PathBuf) {
    toml::with_parsed_file(config_path, sync_from_config)
}

pub fn sync_from_config(config: Config) {
    if config.tools.is_empty() {
        no_tools_message()
    } else {
        sync_from_config_no_check(config)
    }
}

fn no_tools_message() {
    eprintln!(
        r#"No tools to sync. Have you configured 'tool-sync'?

Put the following into the $HOME/.tool.toml file for the simplest configuration:

### START ###

# ensure this directory is listed in $PATH
store_directory = "/path/to/install/directory"

[bat]
[exa]
[fd]
[ripgrep]

### END ###

For more details, refer to the official documentation:

    * https://github.com/chshersh/tool-sync#tool-sync"#
    );
}

const DONE: Emoji<'_, '_> = Emoji("", "* ");
const DIRECTORY: Emoji<'_, '_> = Emoji("📁 ", "* ");

/// Like `sync_from_config` but expects non-empty list of tools
pub fn sync_from_config_no_check(config: Config) {
    let store_directory = config.ensure_store_directory();
    let tool_assets = prefetch(config.tools);

    let tool_pairs = tool_assets
        .iter()
        .map(|ta| ToolPair {
            name: &ta.tool_name,
            tag: &ta.tag,
        })
        .collect();

    let sync_progress = SyncProgress::new(tool_pairs);
    let installer = Installer::mk(store_directory.as_path(), sync_progress);

    let mut installed_tools: u64 = 0;

    for tool_asset in tool_assets {
        let is_success = installer.install(tool_asset);
        if is_success {
            installed_tools += 1
        }
    }

    eprintln!("{} Successfully installed {} tools!", DONE, installed_tools);
    eprintln!(
        "{} Installation directory: {}",
        DIRECTORY,
        store_directory.display()
    );
}