use bpaf::{command, construct, Parser}; use crate::common::config::ModToml; use crate::common::{operations, repository}; use crate::common::operations::NamedModule; #[derive(Debug, Clone)] pub enum CliCommand { Install(Vec), Collect(Vec), Upload(String), List(), Pull(), Diff() } pub fn get_parser() -> impl Parser { let modules = bpaf::positional::("Modules").many(); let install = command("install", construct!(CliCommand::Install(modules)).to_options()) .help("Install modules"); let modules = bpaf::positional::("Modules").many(); let collect = command("collect", construct!(CliCommand::Collect(modules)).to_options()) .help("Collect modules"); let commit_msg = bpaf::positional::("Commit message"); let upload = command("upload", construct!(CliCommand::Upload(commit_msg)).to_options()) .help("Upload files"); let list = command("list", construct!(CliCommand::List()).to_options()) .help("List modules"); let pull = command("pull", construct!(CliCommand::Pull()).to_options()) .help("Downloads update"); let diff = command("diff", construct!(CliCommand::Diff()).to_options()) .help("Show diff of current changes"); construct!([ install, collect, upload, list, pull, diff ]) } pub fn run(config: &ModToml, command: CliCommand) { let map_mod = |name: String| -> NamedModule { match config.modules.get(&name) { None => { println!("Module {name} doesn't exist"); std::process::exit(1); } Some(v) => NamedModule(name, v.clone()) } }; match command { CliCommand::Install(mods) => operations::install(&mods.into_iter().map(map_mod).collect::>()), CliCommand::Collect(mods) => operations::collect(&mods.into_iter().map(map_mod).collect::>()), CliCommand::Upload(msg) => operations::upload(|| msg), CliCommand::List() => config.modules.iter().for_each(|m| println!("Module {}", m.0)), CliCommand::Pull() => repository::pull_repo(), CliCommand::Diff() => repository::diff() } }