1 use winnow::prelude::*; 2 3 mod parser; 4 mod parser_str; 5 main() -> Result<(), lexopt::Error>6fn 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