Skip to main content

t16/
t.rs

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}