uvm_core 0.13.1

The core functionality for the unity version manager commandline client.
Documentation
pub mod editors;
pub mod paths;

use std::io;
use crate::unity;
use thiserror::Error;
//

#[derive(Error, Debug)]
pub enum UvmHubError {
    #[error("unity hub config: '{0}' is missing")]
    ConfigNotFound(String),

    #[error("Unity Hub config directory missing")]
    ConfigDirectoryNotFound,
   
    #[error("failed to read Unity Hub config {config}")]
    ReadConfigError {
        config: String,
        source: anyhow::Error,
    },

    #[error("can't write Unity Hub config: '{config}'")]
    WriteConfigError {
        config: String,
        source: anyhow::Error,
    },
    
    #[error("failed to create config directory")]
    FailedToCreateConfigDirectory {
        source: std::io::Error,
    },
    
    #[error("failed to create config file for config {config}")]
    FailedToCreateConfig {
        config: String,
        source: io::Error
    },

    #[error("Unity Hub editor install path not found")]
    InstallPathNotFound,
}

type Result<T> = std::result::Result<T, UvmHubError>;

pub fn list_installations() -> Result<unity::Installations> {
    let install_path = paths::install_path()
        .ok_or_else(|| UvmHubError::InstallPathNotFound)?;

    debug!("unity hub install path: {}", install_path.display());

    let editors = editors::Editors::load()?;
    debug!("raw editors map: {:?}", editors);
    let editors = unity::Installations::from(editors);
    if let Ok(installations) = unity::list_installations_in_dir(&install_path) {
        let iter = installations.chain(editors);
        return Ok(unity::Installations(Box::new(iter)));
    }

    Ok(editors)
}