id3_cli/
app.rs

1pub mod backup;
2pub mod delete;
3pub mod field;
4pub mod get;
5pub mod set;
6
7use crate::{error::Error, run::Run};
8use backup::Backup;
9use clap::{Parser, Subcommand};
10use delete::Delete;
11use get::Get;
12use set::Set;
13use std::process::ExitCode;
14
15/// The main application.
16#[derive(Debug, Parser)]
17#[clap(name = "id3", version)]
18pub struct App {
19    /// Subcommand to execute.
20    #[clap(subcommand)]
21    pub command: AppCmd,
22}
23
24impl App {
25    /// The main program.
26    pub(crate) fn main() -> ExitCode {
27        match App::parse().run() {
28            Ok(()) => ExitCode::SUCCESS,
29            Err(error) => {
30                eprintln!("error: {error}");
31                ExitCode::FAILURE
32            }
33        }
34    }
35}
36
37impl Run for App {
38    fn run(self) -> Result<(), Error> {
39        let App { command } = self;
40        command.run()
41    }
42}
43
44/// Subcommand of the program.
45#[derive(Debug, Subcommand)]
46pub enum AppCmd {
47    /// Run backup without modification.
48    Backup(Backup),
49    /// Show or export metadata.
50    #[clap(subcommand)]
51    Get(Get),
52    /// Modify metadata.
53    #[clap(subcommand)]
54    Set(Set),
55    /// Delete metadata.
56    #[clap(subcommand)]
57    Delete(Delete),
58}
59
60impl Run for AppCmd {
61    fn run(self) -> Result<(), Error> {
62        match self {
63            AppCmd::Backup(proc) => proc.run(),
64            AppCmd::Get(proc) => proc.run(),
65            AppCmd::Set(proc) => proc.run(),
66            AppCmd::Delete(proc) => proc.run(),
67        }
68    }
69}