1 use winnow::prelude::*;
2 
3 mod parser;
4 mod parser_str;
5 
main() -> Result<(), lexopt::Error>6 fn main() -> Result<(), lexopt::Error> {
7     let args = Args::parse()?;
8 
9     let input = args.input.as_deref().unwrap_or("1 + 1");
10 
11     if args.binary {
12         match parser::categories.parse(input.as_bytes()) {
13             Ok(result) => {
14                 println!("  {:?}", result);
15             }
16             Err(err) => {
17                 println!("  {:?}", err);
18             }
19         }
20     } else {
21         match parser_str::categories.parse(input) {
22             Ok(result) => {
23                 println!("  {:?}", result);
24             }
25             Err(err) => {
26                 println!("  {}", err);
27             }
28         }
29     }
30 
31     Ok(())
32 }
33 
34 #[derive(Default)]
35 struct Args {
36     input: Option<String>,
37     binary: bool,
38 }
39 
40 impl Args {
parse() -> Result<Self, lexopt::Error>41     fn parse() -> Result<Self, lexopt::Error> {
42         use lexopt::prelude::*;
43 
44         let mut res = Args::default();
45 
46         let mut args = lexopt::Parser::from_env();
47         while let Some(arg) = args.next()? {
48             match arg {
49                 Long("binary") => {
50                     res.binary = true;
51                 }
52                 Value(input) => {
53                     res.input = Some(input.string()?);
54                 }
55                 _ => return Err(arg.unexpected()),
56             }
57         }
58         Ok(res)
59     }
60 }
61