1use 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
13pub 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
26pub 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}