vpp/options/
mod.rs

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/// Doc comment
11#[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}