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