use clap::{command, Parser, Subcommand};
use cmd::{install::install, list::list, current::current, shell::shell, exec::exec};
use semver::VersionReq;
use std::{io::{self, Read}, str::FromStr};
mod cmd;
use std::env;
mod utils;
use anyhow::Result;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Current {
#[arg(long, default_value = "false")]
verbose: bool,
},
Shell {
name: Option<String>,
},
Use {
version: Option<VersionReq>,
#[arg(long, default_value="false")]
prerelease: bool
},
List {
version: Option<VersionReq>,
#[arg(long, short, default_value = "5")]
count: Option<usize>,
#[arg(long, short, default_value = "false")]
all: bool,
},
Exec {
#[arg(long, short)]
use_version: Option<VersionReq>,
command: Vec<String>,
#[arg(long, default_value="false")]
prerelease: bool
}
}
fn get_version_from_stdin() -> Option<VersionReq> {
if atty::is(atty::Stream::Stdin) {
return None;
}
let mut buffer = String::new();
if io::stdin().read_to_string(&mut buffer).is_err() {
return None;
}
let stripped_buffer = buffer.strip_suffix('\n')?;
buffer = stripped_buffer.to_string();
Some(VersionReq::from_str(&buffer).unwrap())
}
fn get_version_from_env() -> Option<VersionReq> {
match env::var("WASMER_VERSION") {
Ok(val) => Some(VersionReq::from_str(&val).unwrap()),
Err(_) => None
}
}
fn main() -> Result<()> {
let cli = Cli::parse();
let stdin_version = get_version_from_stdin();
let user_specified_version = if stdin_version.is_some() {stdin_version} else {
get_version_from_env()
};
let command = cli.command;
match command {
Commands::Use { version, prerelease } => {
let version_to_use = if version.is_some() {version} else {user_specified_version};
install(version_to_use, prerelease)
},
Commands::List {
version,
count,
all,
} => {
let version_to_use = if version.is_some() {version} else {user_specified_version};
list(version_to_use, count, all)
},
Commands::Current {verbose} => current(verbose),
Commands::Shell { name } => shell(name),
Commands::Exec {
use_version, command, prerelease
} => {
exec(use_version, command, prerelease)
}
}
}