dvm 1.9.3

Deno Version Manager - Easy way to manage multiple active deno versions.
use std::process::Stdio;

use crate::{
  consts::DVM_VERSION_LATEST,
  meta::DvmMeta,
  utils::{best_version, deno_version_path, is_exact_version, prompt_request},
  version::{remote_versions, VersionArg},
};
use anyhow::Result;
use colored::Colorize;
use semver::Version;

use super::install;

pub fn exec(meta: &mut DvmMeta, version: Option<String>, args: Vec<String>) -> Result<()> {
  let versions = remote_versions().expect("Failed to get remote versions");
  let version = version.unwrap_or_else(|| DVM_VERSION_LATEST.to_string());
  let v = version.clone();

  let Some(version) = is_exact_version(&version).then_some(version).or_else(|| {
    meta.has_alias(&v).then(|| {
      let version_req = meta.resolve_version_req(&v);
      match version_req {
        VersionArg::Exact(v) => v.to_string(),
        VersionArg::Range(r) => {
          let best = best_version(versions.iter().map(AsRef::as_ref), r.clone());
          if let Some(best) = best {
            best.to_string()
          } else {
            eprintln!("No version found for {} in {:?}", r, versions);
            std::process::exit(1);
          }
        }
      }
    })
  }) else {
    eprintln!("{}", "No such alias or version found.".red());
    std::process::exit(1);
  };

  let executable_path = deno_version_path(&Version::parse(&version).unwrap());

  if !executable_path.exists() {
    if prompt_request(format!("deno v{} is not installed. do you want to install it?", version).as_str()) {
      install::exec(meta, true, Some(version.clone())).unwrap_or_else(|_| panic!("Failed to install deno {}", version));
    } else {
      eprintln!("{}", "No such version found.".red());
      std::process::exit(1);
    }
  }

  let mut cmd = std::process::Command::new(executable_path)
    .args(args)
    .stderr(Stdio::inherit())
    .stdout(Stdio::inherit())
    .stdin(Stdio::inherit())
    .spawn()
    .unwrap();

  cmd.wait().unwrap();
  Ok(())
}