summaryrefslogtreecommitdiffstats
path: root/vendor/winnow/examples/json/main.rs
blob: be431e8c2d833231be402338cc09ead1bc77bb3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
mod json;
mod parser;
mod parser_dispatch;
#[allow(dead_code)]
mod parser_partial;

use winnow::error::ErrorKind;
use winnow::prelude::*;

fn main() -> Result<(), lexopt::Error> {
    let args = Args::parse()?;

    let data = args.input.as_deref().unwrap_or(if args.invalid {
        "  { \"a\"\t: 42,
  \"b\": [ \"x\", \"y\", 12 ] ,
  \"c\": { 1\"hello\" : \"world\"
  }
  } "
    } else {
        "  { \"a\"\t: 42,
  \"b\": [ \"x\", \"y\", 12 ] ,
  \"c\": { \"hello\" : \"world\"
  }
  } "
    });

    let result = match args.implementation {
        Impl::Naive => parser::json::<ErrorKind>.parse(data),
        Impl::Dispatch => parser_dispatch::json::<ErrorKind>.parse(data),
    };
    match result {
        Ok(json) => {
            println!("{:#?}", json);
        }
        Err(err) => {
            if args.pretty {
                println!("{}", err);
            } else {
                println!("{:#?}", err);
            }
        }
    }

    Ok(())
}

#[derive(Default)]
struct Args {
    input: Option<String>,
    invalid: bool,
    pretty: bool,
    implementation: Impl,
}

enum Impl {
    Naive,
    Dispatch,
}

impl Default for Impl {
    fn default() -> Self {
        Self::Naive
    }
}

impl Args {
    fn parse() -> Result<Self, lexopt::Error> {
        use lexopt::prelude::*;

        let mut res = Args::default();

        let mut args = lexopt::Parser::from_env();
        while let Some(arg) = args.next()? {
            match arg {
                Long("invalid") => {
                    res.invalid = true;
                }
                Long("pretty") => {
                    // Only case where pretty matters
                    res.pretty = true;
                    res.invalid = true;
                }
                Long("impl") => {
                    res.implementation = args.value()?.parse_with(|s| match s {
                        "naive" => Ok(Impl::Naive),
                        "dispatch" => Ok(Impl::Dispatch),
                        _ => Err("expected `naive`, `dispatch`"),
                    })?;
                }
                Value(input) => {
                    res.input = Some(input.string()?);
                }
                _ => return Err(arg.unexpected()),
            }
        }
        Ok(res)
    }
}