1use std::io::ErrorKind;
2
3use clap::{Args, Subcommand, ValueEnum};
4
5use crate::{
6 cmd_package_manager::{AddCommand, RemoveCommand, UpdateCommand},
7 BuildCommand,
8};
9
10#[derive(Subcommand)]
12pub enum ApplicationCommand {
13 Add(AddCommand),
14 Update(UpdateCommand),
15 #[command(alias = "rm")]
16 Remove(RemoveCommand),
17 Build(BuildCommand),
18 #[command(external_subcommand)]
19 External(Vec<String>),
20}
21
22#[derive(Debug, Args)]
23pub struct SharedOptions {
24 #[arg(long)]
25 offline: bool,
26 #[arg(long)]
27 dry_run: bool,
28}
29
30#[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Eq)]
31enum ColorWhen {
32 Always,
33 Auto,
34 Never,
35}
36
37impl ApplicationCommand {
38 pub fn run(&self) {
39 match self {
40 ApplicationCommand::Build(v) => {
41 println!("build: {v:?}")
42 }
43 ApplicationCommand::External(v) => match v.as_slice() {
44 [cmd, args @ ..] => {
45 self.spawn(cmd, args);
46 }
47 [] => {}
48 },
49 ApplicationCommand::Add(v) => v.run(),
50 ApplicationCommand::Update(v) => v.run(),
51 ApplicationCommand::Remove(v) => v.run(),
52 }
53 }
54 pub fn spawn(&self, command: &String, arguments: &[String]) {
55 match std::process::Command::new(format!("vpp-{command}")).args(arguments).spawn() {
56 Ok(mut o) => {
57 o.wait().unwrap();
58 }
59 Err(e) => match e.kind() {
60 ErrorKind::NotFound => {
61 println!("Command not found: `vpp-{command}`")
62 }
63 _ => {}
64 },
65 };
66 }
67}