ztl-cli 0.1.0

Interactive cli for running scripts from Package.json
use std::process::Command;
use crate::error::ZtlError;

pub enum PackageManager {
    Npm,
    Yarn,
    YarnClassic,
    Pnpm,
}

impl PackageManager {
    pub fn detect() -> Result<Self, ZtlError> {
        if which::which("pnpm").is_ok() {
            Ok(PackageManager::Pnpm)
        } else if which::which("yarn").is_ok() {
            if is_classic_yarn() {
                Ok(PackageManager::YarnClassic)
            } else {
                Ok(PackageManager::Yarn)
            }
        } else if which::which("npm").is_ok() {
            Ok(PackageManager::Npm)
        } else {
            Err(ZtlError::NoPackageManagerFound)
        }
    }

    pub fn command_and_run_arg(&self) -> (&'static str, &'static str) {
        match self {
            PackageManager::Npm => ("npm", "run"),
            PackageManager::Yarn => ("yarn", "run"),
            PackageManager::YarnClassic => ("yarn", ""),
            PackageManager::Pnpm => ("pnpm", ""),
        }
    }
}

fn is_classic_yarn() -> bool {
    if let Ok(output) = Command::new("yarn").arg("--version").output() {
        if let Ok(version) = String::from_utf8(output.stdout) {
            return version.trim().starts_with('1');
        }
    }
    false
}