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