cmake-version-manager 0.2.4

CMake version helps manage installed versions of cmake.
pub struct HelperStrings {
    pub bins_path: PathBuf,
    pub download_url: String,
    pub save_path: PathBuf,
    pub server_name: String,
}

impl HelperStrings {
    pub fn new(cvm_home: &Path, version: &str) -> Result<Self, Rc<str>> {
        download_strings(cvm_home, version)
    }
}

#[cfg(target_os = "macos")]
fn pre_19_2(cvm_home: &Path, version: &str) -> HelperStrings {
    let name = format!("cmake-{}", version);
    let server_name = format!("{}-Darwin-x86_64", name);
    let download_url = format!(
        "https://github.com/Kitware/CMake/releases/download/v{}/{}.tar.gz",
        version, server_name
    );

    let bins_path = cvm_home.join(crate::CVM_BINS);
    let save_path = bins_path.clone().join(format!("{}.tar.gz", name));

    HelperStrings {
        bins_path,
        download_url,
        save_path,
        server_name,
    }
}

#[cfg(target_os = "macos")]
fn post_19_1(cvm_home: &Path, version: &str) -> Result<HelperStrings, Rc<str>> {
    let name = format!("cmake-{}", version);

    let system = System::new();
    let os_version = match system.get_os_version() {
        Some(version) => version,
        None => panic!("Failed to get the os version"),
    };

    let mac_version = parse_version(&os_version)?;

    let dw_name = if mac_version.major < 10 || mac_version.major == 10 && mac_version.minor <= 10 {
        "macos10.10-universal"
    } else {
        "macos-universal"
    };

    let server_name = format!("{}-{}", name, dw_name);
    let download_url = format!(
        "https://github.com/Kitware/CMake/releases/download/v{}/{}.tar.gz",
        version, server_name
    );

    let bins_path = cvm_home.join(crate::CVM_BINS);
    let save_path = bins_path.clone().join(format!("{}.tar.gz", name));

    Ok(HelperStrings {
        bins_path,
        download_url,
        save_path,
        server_name,
    })
}

#[cfg(target_os = "macos")]
fn download_strings(cvm_home: &Path, version: &str) -> Result<HelperStrings, Rc<str>> {
    let cmake_version = parse_version(version)?;
    if cmake_version.minor < 19 || cmake_version.minor == 19 && cmake_version.patch <= 1 {
        return Ok(pre_19_2(cvm_home, version));
    }

    post_19_1(cvm_home, version)
}

#[cfg(target_os = "linux")]
#[cfg(target_arch = "x86_64")]
fn download_strings(cvm_home: &Path, version: &str) -> Result<HelperStrings, Rc<str>> {
    let cmake_version = parse_version(version)?;

    let linux = if cmake_version.minor > 19 {
        "linux"
    } else {
        "Linux"
    };
    let name = format!("cmake-{}", version);
    let server_name = format!("{}-{}-x86_64", name, linux);
    let download_url = format!(
        "https://github.com/Kitware/CMake/releases/download/v{}/{}.tar.gz",
        version, server_name
    );

    let bins_path = cvm_home.join(crate::CVM_BINS);
    let save_path = bins_path.clone().join(format!("{}.tar.gz", name));

    Ok(HelperStrings {
        bins_path,
        download_url,
        save_path,
        server_name,
    })
}

#[cfg(windows)]
fn post_19(cvm_home: &Path, version: &str) -> HelperStrings {
    let arch = if cfg!(target_arch = "x86") {
        "windows-i386"
    } else {
        "windows-x86_64"
    };

    let name = format!("cmake-{}", version);
    let server_name = format!("{}-{}", name, arch);
    let download_url = format!(
        "https://github.com/Kitware/CMake/releases/download/v{}/{}.zip",
        version, server_name
    );

    let bins_path = cvm_home.join(crate::CVM_BINS);
    let save_path = bins_path.clone().join(format!("{}.zip", name));

    HelperStrings {
        bins_path,
        download_url,
        save_path,
        server_name,
    }
}

#[cfg(windows)]
fn pre_20(cvm_home: &Path, version: &str) -> HelperStrings {
    let arch = if cfg!(target_arch = "x86") {
        "32-x86"
    } else {
        "64-x64"
    };

    let name = format!("cmake-{}", version);
    let server_name = format!("{}-win{}", name, arch);
    let download_url = format!(
        "https://github.com/Kitware/CMake/releases/download/v{}/{}.zip",
        version, server_name
    );

    let bins_path = cvm_home.join(crate::CVM_BINS);
    let save_path = bins_path.clone().join(format!("{}.zip", name));

    HelperStrings {
        bins_path,
        download_url,
        save_path,
        server_name,
    }
}

#[cfg(windows)]
fn download_strings(cvm_home: &Path, version: &str) -> Result<HelperStrings, Rc<str>> {
    let cmake_version = parse_version(version)?;
    if cmake_version.minor >= 20 {
        return Ok(post_19(cvm_home, version));
    }

    Ok(pre_20(cvm_home, version))
}

fn parse_version(version: &str) -> Result<utils::Version, Rc<str>> {
    let version_clean = match version.find('-') {
        Some(index) => &version[0..index],
        None => version,
    };

    utils::parse_version(version_clean)
}

#[cfg(target_os = "macos")]
use sysinfo::{System, SystemExt};

use std::path::{Path, PathBuf};
use std::rc::Rc;

use crate::utils;