use std::process::exit;
use clap::Parser;
use clap::Subcommand;
use unlab_gpu::pkg::default_src_factories;
use unlab_gpu::pkg_cmds::list;
use unlab_gpu::pkg_cmds::list_deps;
use unlab_gpu::pkg_cmds::search;
use unlab_gpu::pkg_cmds::search_deps;
use unlab_gpu::pkg_cmds::show;
use unlab_gpu::pkg_cmds::show_dep;
use unlab_gpu::pkg_cmds::update;
use unlab_gpu::pkg_cmds::update_deps;
use unlab_gpu::pkg_cmds::install;
use unlab_gpu::pkg_cmds::install_all;
use unlab_gpu::pkg_cmds::install_deps;
use unlab_gpu::pkg_cmds::remove;
use unlab_gpu::pkg_cmds::check;
use unlab_gpu::pkg_cmds::check_deps;
use unlab_gpu::pkg_cmds::cont;
use unlab_gpu::pkg_cmds::continue_deps;
use unlab_gpu::pkg_cmds::clean;
use unlab_gpu::pkg_cmds::clean_deps;
use unlab_gpu::pkg_cmds::lock;
use unlab_gpu::pkg_cmds::clean_index;
use unlab_gpu::pkg_cmds::clean_cache;
use unlab_gpu::pkg_cmds::clean_work;
use unlab_gpu::pkg_cmds::config;
use unlab_gpu::pkg_cmds::init;
use unlab_gpu::pkg_cmds::new;
use unlab_gpu::pkg_cmds::run;
use unlab_gpu::pkg_cmds::console;
use unlab_gpu::pkg_cmds::doc;
use unlab_gpu::pkg_cmds::test;
use unlab_gpu::pkg_cmds::clean_test;
use unlab_gpu::pkg_cmds::std_doc;
use unlab_gpu::pkg_cmds::std_doc_deps;
use unlab_gpu::Home;
use unlab_gpu::add_std_builtin_funs;
#[derive(Parser, Debug)]
struct SearchArgs
{
patterns: Vec<String>,
}
#[derive(Parser, Debug)]
struct ShowArgs
{
#[arg(short, long)]
manifest: bool,
#[arg(short, long)]
dependents: bool,
#[arg(short, long)]
paths: bool,
package: String,
}
#[derive(Parser, Debug)]
struct UpdateArgs
{
packages: Vec<String>,
}
#[derive(Parser, Debug)]
struct InstallArgs
{
#[arg(short, long)]
update: bool,
#[arg(short, long)]
force: bool,
#[arg(short, long)]
no_doc: bool,
packages: Vec<String>,
}
#[derive(Parser, Debug)]
struct InstallAllArgs
{
#[arg(short, long)]
update: bool,
#[arg(short, long)]
force: bool,
#[arg(short, long)]
no_doc: bool,
}
#[derive(Parser, Debug)]
struct InstallDepsArgs
{
#[arg(short, long)]
update: bool,
#[arg(short, long)]
force: bool,
#[arg(short, long)]
no_doc: bool,
#[arg(short, long)]
lock: bool,
#[arg(short = 'm', long)]
unlock: bool,
}
#[derive(Parser, Debug)]
struct RemoveArgs
{
packages: Vec<String>,
}
#[derive(Parser, Debug)]
struct ContinueArgs
{
#[arg(short, long)]
no_doc: bool,
}
#[derive(Parser, Debug)]
struct ConfigArgs
{
#[arg(short, long)]
account: Option<String>,
#[arg(short, long)]
domain: Option<String>,
}
#[derive(Parser, Debug)]
struct InitArgs
{
#[arg(short, long)]
name: Option<String>,
#[arg(short, long)]
account: Option<String>,
#[arg(short, long)]
domain: Option<String>,
#[arg(short, long)]
bin: bool,
#[arg(short, long)]
lib: bool,
#[arg(short, long)]
tests: bool,
dir: Option<String>,
}
#[derive(Parser, Debug)]
struct NewArgs
{
#[arg(short, long)]
name: Option<String>,
#[arg(short, long)]
account: Option<String>,
#[arg(short, long)]
domain: Option<String>,
#[arg(short, long)]
bin: bool,
#[arg(short, long)]
lib: bool,
#[arg(short, long)]
tests: bool,
dir: String,
}
#[derive(Parser, Debug)]
struct RunArgs
{
#[arg(short, long)]
no_ctrl_c: bool,
#[arg(short = 'p', long)]
no_plotter_windows: bool,
bin_name: String,
args: Vec<String>,
}
#[derive(Parser, Debug)]
struct ConsoleArgs
{
#[arg(short, long)]
no_ctrl_c: bool,
#[arg(short = 'p', long)]
no_plotter_windows: bool,
}
#[derive(Parser, Debug)]
struct TestArgs
{
#[arg(short = 's', long)]
test_suite: bool,
#[arg(short = 'o', long)]
show_output: bool,
#[arg(short, long)]
no_handled_output: bool,
name: Option<String>,
}
#[derive(Subcommand, Debug)]
enum Subcmd
{
List,
ListDeps,
Search(SearchArgs),
SearchDeps(SearchArgs),
Show(ShowArgs),
ShowDep(ShowArgs),
Update(UpdateArgs),
UpdateDeps(UpdateArgs),
Install(InstallArgs),
InstallAll(InstallAllArgs),
InstallDeps(InstallDepsArgs),
Remove(RemoveArgs),
Check,
CheckDeps,
Continue(ContinueArgs),
ContinueDeps(ContinueArgs),
Clean,
CleanDeps,
Lock,
CleanIndex,
CleanCache,
CleanWork,
Config(ConfigArgs),
Init(InitArgs),
New(NewArgs),
Run(RunArgs),
Console(ConsoleArgs),
Doc,
Test(TestArgs),
CleanTest,
StdDoc,
StdDocDeps,
}
#[derive(Parser, Debug)]
#[command(version)]
struct Args
{
#[arg(short = 'H', long)]
home_dir: Option<String>,
#[arg(short = 'B', long)]
bin_path: Option<String>,
#[arg(short = 'L', long)]
lib_path: Option<String>,
#[arg(short = 'D', long)]
doc_path: Option<String>,
#[arg(short, long)]
bin_dir: Vec<String>,
#[arg(short, long)]
lib_dir: Vec<String>,
#[arg(short, long)]
doc_dir: Vec<String>,
#[clap(subcommand)]
subcommand: Subcmd,
}
fn main()
{
let args = Args::parse();
let add_dirs = |home: &mut Home| {
match home.add_dirs_to_bin_path(args.bin_dir.as_slice()) {
Ok(()) => (),
Err(err) => {
eprintln!("{}", err);
return false;
},
}
match home.add_dirs_to_lib_path(args.lib_dir.as_slice()) {
Ok(()) => (),
Err(err) => {
eprintln!("{}", err);
return false;
},
}
match home.add_dirs_to_doc_path(args.doc_dir.as_slice()) {
Ok(()) => (),
Err(err) => {
eprintln!("{}", err);
return false;
},
}
true
};
let src_factories = default_src_factories();
let exit_code = match &args.subcommand {
Subcmd::List => {
list(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::ListDeps => {
list_deps(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Search(args2) => {
search(args2.patterns.as_slice(), &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::SearchDeps(args2) => {
search_deps(args2.patterns.as_slice(), &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Show(args2) => {
show(args2.package.as_str(), args2.manifest, args2.dependents, args2.paths, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::ShowDep(args2) => {
show_dep(args2.package.as_str(), args2.manifest, args2.dependents, args2.paths, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Update(args2) => {
update(args2.packages.as_slice(), &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::UpdateDeps(args2) => {
update_deps(args2.packages.as_slice(), &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Install(args2) => {
install(args2.packages.as_slice(), args2.update, args2.force, !args2.no_doc, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::InstallAll(args2) => {
install_all(args2.update, args2.force, !args2.no_doc, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::InstallDeps(args2) => {
install_deps(args2.update, args2.force, !args2.no_doc, args2.lock, args2.unlock, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Remove(args2) => {
remove(args2.packages.as_slice(), &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Check => {
check(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::CheckDeps => {
check_deps(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Continue(args2) => {
cont(!args2.no_doc, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::ContinueDeps(args2) => {
continue_deps(!args2.no_doc, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Clean => {
clean(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::CleanDeps => {
clean_deps(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Lock => {
lock(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::CleanIndex => {
clean_index(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs)
},
Subcmd::CleanCache => {
clean_cache(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs)
},
Subcmd::CleanWork => {
clean_work(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs)
},
Subcmd::Config(args2) => {
config(&args2.account, &args2.domain, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs)
},
Subcmd::Init(args2) => {
init(&args2.dir, &args2.name, &args2.account, &args2.domain, args2.bin, args2.lib, args2.tests, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs)
},
Subcmd::New(args2) => {
new(args2.dir.as_str(), &args2.name, &args2.account, &args2.domain, args2.bin, args2.lib, args2.tests, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs)
},
Subcmd::Run(args2) => {
run(args2.bin_name.as_str(), args2.args.clone(), !args2.no_ctrl_c, !args2.no_plotter_windows, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs, add_std_builtin_funs)
},
Subcmd::Console(args2) => {
console(!args2.no_ctrl_c, !args2.no_plotter_windows, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs, add_std_builtin_funs)
},
Subcmd::Doc => {
doc(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::Test(args2) => {
test(&args2.name, args2.test_suite, args2.show_output, !args2.no_handled_output, &args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs, add_std_builtin_funs)
},
Subcmd::CleanTest => {
clean_test(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, add_dirs)
},
Subcmd::StdDoc => {
std_doc(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
Subcmd::StdDocDeps => {
std_doc_deps(&args.home_dir, &args.bin_path, &args.lib_path, &args.doc_path, src_factories, add_dirs)
},
};
match exit_code {
Some(exit_code) => exit(exit_code),
None => (),
}
}