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#[derive(Debug, Parser)]
17#[clap(name = "id3", version)]
18pub struct App {
19 #[clap(subcommand)]
21 pub command: AppCmd,
22}
23
24impl App {
25 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#[derive(Debug, Subcommand)]
46pub enum AppCmd {
47 Backup(Backup),
49 #[clap(subcommand)]
51 Get(Get),
52 #[clap(subcommand)]
54 Set(Set),
55 #[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}