leetcode_cli/
cli.rs

1//! Clap Commanders
2use crate::{
3    cmds::{
4        completion_handler, Command, CompletionCommand, DataCommand, EditCommand, ExecCommand,
5        ListCommand, PickCommand, StatCommand, TestCommand,
6    },
7    err::Error,
8    flag::{Debug, Flag},
9};
10use clap::crate_version;
11use log::LevelFilter;
12
13/// This should be called before calling any cli method or printing any output.
14pub fn reset_signal_pipe_handler() {
15    #[cfg(target_family = "unix")]
16    {
17        use nix::sys::signal;
18
19        unsafe {
20            let _ = signal::signal(signal::Signal::SIGPIPE, signal::SigHandler::SigDfl)
21                .map_err(|e| println!("{:?}", e));
22        }
23    }
24}
25
26/// Get matches
27pub async fn main() -> Result<(), Error> {
28    reset_signal_pipe_handler();
29
30    let mut cmd = clap::Command::new("leetcode")
31        .version(crate_version!())
32        .about("May the Code be with You 👻")
33        .subcommands(vec![
34            DataCommand::usage().display_order(1),
35            EditCommand::usage().display_order(2),
36            ExecCommand::usage().display_order(3),
37            ListCommand::usage().display_order(4),
38            PickCommand::usage().display_order(5),
39            StatCommand::usage().display_order(6),
40            TestCommand::usage().display_order(7),
41            CompletionCommand::usage().display_order(8),
42        ])
43        .arg(Debug::usage())
44        .arg_required_else_help(true);
45
46    let m = cmd.clone().get_matches();
47
48    if m.get_flag("debug") {
49        Debug::handler()?;
50    } else {
51        env_logger::Builder::new()
52            .filter_level(LevelFilter::Info)
53            .format_timestamp(None)
54            .init();
55    }
56
57    match m.subcommand() {
58        Some(("data", sub_m)) => Ok(DataCommand::handler(sub_m).await?),
59        Some(("edit", sub_m)) => Ok(EditCommand::handler(sub_m).await?),
60        Some(("exec", sub_m)) => Ok(ExecCommand::handler(sub_m).await?),
61        Some(("list", sub_m)) => Ok(ListCommand::handler(sub_m).await?),
62        Some(("pick", sub_m)) => Ok(PickCommand::handler(sub_m).await?),
63        Some(("stat", sub_m)) => Ok(StatCommand::handler(sub_m).await?),
64        Some(("test", sub_m)) => Ok(TestCommand::handler(sub_m).await?),
65        Some(("completions", sub_m)) => Ok(completion_handler(sub_m, &mut cmd)?),
66        _ => Err(Error::MatchError),
67    }
68}