Struct blarg::GeneralParser

source ·
pub struct GeneralParser<'a> { /* private fields */ }
Expand description

The configured command line parser. Built via CommandLineParser::build or SubCommandParser::build.

Implementations§

source§

impl<'a> GeneralParser<'a>

source

pub fn parse_tokens(self, tokens: &[&str]) -> Result<(), i32>

Run the command line parser against the input tokens. Help messages are printed on stdout, while error messages are printed on stderr.

The parser will process the input tokens based off the CommandLineParser/SubCommandParser configuration. Parsing happens in two phases:

  1. Token matching aligns the tokens to arguments and options. All tokens must be matched successfully in order to proceed to the next phase.
  2. Token capturing parses the tokens by their respective types T. This phase will actually mutate your program variables.

If at any point the parser encounters an error (ex: un-matched token, un-capturable token, etc), it will return with Err(1).

If the help switch (-h or --help) is encountered, the parser will display the help message and return with Err(0). This skips the phase #2 capturing.

In the case of a sub-command based parser, a third phase is introduced where the parser is branched into the sub-command. After branching, the token matching and token capturing phases are repeated for the sub-command. In effect, the input tokens are partitioned based off the branching Condition.

source

pub fn parse(self)

Run the command line parser against the Cli env::args. Help messages are printed on stdout, while error messages are printed on stderr.

The parser will process the input tokens based off the CommandLineParser/SubCommandParser configuration. Parsing happens in two phases:

  1. Token matching aligns the tokens to arguments and options. All tokens must be matched successfully in order to proceed to the next phase.
  2. Token capturing parses the tokens by their respective types T. This phase will actually mutate your program variables.

If at any point the parser encounters an error (ex: un-matched token, un-capturable token, etc), it will exit with error code 1 (via std::process::exit).

If the help switch (-h or --help) is encountered, the parser will display the help message and exit with error code 0. This skips the phase #2 capturing.

In the case of a sub-command based parser, a third phase is introduced where the parser is branched into the sub-command. After branching, the token matching and token capturing phases are repeated for the sub-command. In effect, the input tokens are partitioned based off the branching Condition.

Examples found in repository?
examples/demo_organization.rs (line 26)
25
26
27
fn parse() -> Params {
    parse_tokens(|parser: GeneralParser| Ok(parser.parse()))
}
More examples
Hide additional examples
examples/empty.rs (line 6)
3
4
5
6
7
8
fn main() {
    let ap = CommandLineParser::new("empty");
    let parser = ap.build();
    parser.parse();
    println!("empty parser");
}
examples/demo_summer_b.rs (line 14)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fn main() {
    let mut items: Vec<u32> = Vec::default();

    let clp = CommandLineParser::new("summer");
    let parser = clp
        .add(
            Parameter::argument(Collection::new(&mut items, Nargs::AtLeastOne), "item")
                .help("The items to sum."),
        )
        .build();

    parser.parse();
    let sum: u32 = items.iter().sum();
    println!("Sum: {sum}");
}
examples/example.rs (line 14)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fn main() {
    let mut verbose: bool = false;
    let mut value: u32 = 0;
    let ap = CommandLineParser::new("example");
    let parser = ap
        .add(Parameter::option(
            Switch::new(&mut verbose, true),
            "verbose",
            Some('v'),
        ))
        .add(Parameter::argument(Scalar::new(&mut value), "value").meta(vec!["type: u32"]))
        .build();
    parser.parse();
    println!("value: {value}, verbose: {verbose}");
}
examples/reducer.rs (line 81)
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
fn main() {
    let mut _verbose: bool = false;
    let mut operand: Operand = Operand::Add;
    let mut initial: Option<u32> = None;
    let mut _countries: HashSet<Country> = HashSet::default();
    let mut items: Vec<u32> = Vec::default();

    let ap = CommandLineParser::new("reducer");
    let parser = ap
        .add(
            Parameter::option(Switch::new(&mut _verbose, true), "verbose", Some('v'))
                .help("Do dee doo.  We're really stretching here HAAAAAAAA HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!"),
        )
        .add(
            Parameter::option(Scalar::new(&mut operand), "operand", Some('o'))
                .help("moot")
                .choice(Operand::Add, "+")
                .choice(Operand::Multiply, "*"),
        )
        .add(Parameter::option(Optional::new(&mut initial), "initial", None)
            .meta(vec!["testing a really long meta.. abcdefghijklmnopqrstuvwxyz"])
        )
        .add(Parameter::option(Collection::new(&mut _countries, Nargs::AtLeastOne), "country", None))
        .add(
            Parameter::argument(Collection::new(&mut items, Nargs::AtLeastOne), "item")
                .help("The items."),
        )
        .build();
    parser.parse();
    println!("Items: {items:?}");
    execute(_verbose, operand, initial, _countries, items);
}
examples/foo_bar.rs (line 93)
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
fn main() {
    let mut verbose: bool = false;
    let mut foo_bar = FooBar::Foo;
    let mut initial: Option<u32> = None;
    let mut countries: HashSet<Country> = HashSet::default();
    let mut items: Vec<u32> = Vec::default();

    let ap = CommandLineParser::new("foo_bar");
    let parser = ap
        .add(
            Parameter::option(Switch::new(&mut verbose, true), "verbose", Some('v'))
                .help("Do dee doo."),
        )
        .branch(
            Condition::new(Scalar::new(&mut foo_bar), "foo_bar")
                .choice(FooBar::Foo, "123 abc let's make this one medium long.")
                .choice(FooBar::Bar, "456 def let's make this one multiple sentences.  We're really stretching here HAAAAAAAA HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!")
                .help("foo'y bar'y stuff")
                .meta(vec!["a", "b", "c"]),
        )
        .command(FooBar::Foo, |sub| {
            sub.add(Parameter::option(
                Optional::new(&mut initial),
                "initial",
                None,
            ))
            .add(
                Parameter::argument(Collection::new(&mut items, Nargs::Any), "item")
                    .help("The items."),
            )
        })
        .command(FooBar::Bar, |sub| {
            sub.add(Parameter::option(
                Collection::new(&mut countries, Nargs::AtLeastOne),
                "country",
                None,
            ))
        })
        .build();
    parser.parse();
    println!("Items: {items:?}");
    execute(verbose, foo_bar, initial, countries, items);
}

Trait Implementations§

source§

impl<'a> Debug for GeneralParser<'a>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> !RefUnwindSafe for GeneralParser<'a>

§

impl<'a> !Send for GeneralParser<'a>

§

impl<'a> !Sync for GeneralParser<'a>

§

impl<'a> Unpin for GeneralParser<'a>

§

impl<'a> !UnwindSafe for GeneralParser<'a>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more