1use clap::{Parser, Subcommand};
2
3use crate::generate;
4
5#[derive(Parser, Debug)]
6#[command(version, about)]
7pub struct Cli {
8 #[command(subcommand)]
9 pub commands: Commands,
10}
11
12#[derive(Debug, Subcommand)]
13pub enum Commands {
14 G(Generate),
15 P(Parse),
16}
17
18#[derive(Parser, Debug)]
19pub struct Generate {
20 #[arg(short, long)]
21 pub oneway: bool,
22
23 #[arg(short, long)]
24 pub nanoseconds: bool,
25}
26
27#[derive(Parser, Debug)]
28pub struct Parse {
29 #[arg()]
30 pub parse_data: Vec<String>,
31
32 #[arg(short, long)]
33 pub oneway: bool,
34}
35
36pub trait Dispatch: Parser {
37 fn dispatch() {
38 Self::parse().cli()
39 }
40 fn cli(&self);
41}
42
43impl Dispatch for Parse {
44 fn cli(&self) {
45 use crate::fun::parse;
46 for data in self.parse_data.iter() {
47 println!("{}", parse(&data, self.oneway));
48 }
49 }
50}
51impl Dispatch for Generate {
52 fn cli(&self) {
53 println!("{}", generate(self.nanoseconds, self.oneway));
54 }
55}
56impl Dispatch for Cli {
57 fn cli(&self) {
58 match Cli::parse().commands {
59 Commands::G(run) => run.cli(),
60 Commands::P(run) => run.cli(),
61 }
62 }
63}