use std::env::args_os;
use crate::{
constants::APP_VERSION,
registry::Registry,
utils::{get_newest_version, not_command, to_out},
};
type Args = (String, Vec<String>);
pub fn parse_args() -> Args {
let mut args_os = args_os().map(|os_string| os_string.into_string().unwrap());
args_os.next();
let command = args_os.next();
if command.is_none() {
not_command("");
}
(
command.unwrap(),
args_os
.map(|v| v.trim().to_string())
.collect::<Vec<String>>(),
)
}
pub fn handle_command((command, args): Args) {
let mut r = Registry::new();
match command.trim().to_lowercase().as_str() {
"list" => println!("{}", r.list(&r.current().0)),
"default" => r.default(),
"use" => r.select(args.get(0)),
"remove" => r.remove(args.get(0)),
"publish" => r.publish(args.join(" ")),
"update" => r.update(args.join(" ")),
"install" => r.install(args.join(" ")),
"test" => r.test(&r.current().0, args.get(0)),
"current" => {
let (name, addr) = r.current();
match addr {
Some(addr) => to_out(format!("{}: {}", name, addr)),
None => to_out(name),
};
}
"version" => {
println!(" crm v{APP_VERSION}");
}
"check-update" => {
match get_newest_version() {
Some(newest) => {
if newest != APP_VERSION {
return println!(" 检测到新版本: {newest},请切换到官方镜像源以执行更新");
}
}
None => {}
};
println!(" 暂无更新");
}
command => {
let name = args.get(0);
let addr = args.get(1);
let dl = args.get(2);
match command {
"best" => r.best(name),
"save" => r.save(name, addr, dl),
_ => not_command(command),
}
}
}
}