hyper-jump 0.11.0

A generalist all-in-one command-line version manager toolset for a more efficient development workflow.
use std::path::Path;
use std::path::PathBuf;

use miette::IntoDiagnostic;

use crate::ports::Env;
use crate::ports::RootDir;

const DEFAULT_PATH_NAME: &str = "hyper-jump";

fn default_root_dir(env: &dyn Env) -> miette::Result<PathBuf> {
    let home = env.home_dir().ok_or_else(|| miette::miette!("Use root_dir parameter or env"))?;
    Ok(home.join(".local/share").join(DEFAULT_PATH_NAME))
}

pub fn ensure_root_dir(explicit: Option<&Path>, env: &dyn Env) -> miette::Result<PathBuf> {
    let defined = if let Some(path) = explicit {
        path.join(DEFAULT_PATH_NAME)
    } else if let Some(root) = env.root_dir() {
        root.join(DEFAULT_PATH_NAME)
    } else {
        default_root_dir(env)?
    };

    std::fs::create_dir_all(&defined).into_diagnostic()?;

    Ok(defined)
}

pub struct Dirs {
    pub root_dir: PathBuf,
}

impl Dirs {
    pub fn try_new(root_dir: Option<&Path>, env: &dyn Env) -> miette::Result<Self> {
        let root_dir = ensure_root_dir(root_dir, env)?;

        Ok(Self { root_dir })
    }
}

impl RootDir for Dirs {
    async fn root_dir(&self) -> anyhow::Result<PathBuf> { Ok(self.root_dir.clone()) }
}