diff options
Diffstat (limited to 'clap/examples/13a_enum_values_automatic.rs')
| -rw-r--r-- | clap/examples/13a_enum_values_automatic.rs | 68 | 
1 files changed, 68 insertions, 0 deletions
| diff --git a/clap/examples/13a_enum_values_automatic.rs b/clap/examples/13a_enum_values_automatic.rs new file mode 100644 index 0000000..1abe5cb --- /dev/null +++ b/clap/examples/13a_enum_values_automatic.rs @@ -0,0 +1,68 @@ +// You can use clap's value_t! macro with a custom enum by implementing the std::str::FromStr +// trait which is very straight forward. There are three ways to do this, for simple enums +// meaning those that don't require 'pub' or any '#[derive()]' directives you can use clap's +// simple_enum! macro. For those that require 'pub' or any '#[derive()]'s you can use clap's +// arg_enum! macro. The third way is to implement std::str::FromStr manually. +// +// In most circumstances using either simple_enum! or arg_enum! is fine. +// +// In the following example we will create two enums using macros, assign a positional argument +// that accepts only one of those values, and use clap to parse the argument. + +// Add clap like normal +#[macro_use] +extern crate clap; + +use clap::{App, Arg}; + +// Using arg_enum! is more like traditional enum declarations +// +// **NOTE:** Only bare variants are supported +arg_enum!{ +    #[derive(Debug)] +    pub enum Oof { +        Rab, +        Zab, +        Xuq +    } +} + +arg_enum!{ +    #[derive(Debug)] +    enum Foo { +        Bar, +        Baz, +        Qux +    } +} + +fn main() { +    // Create the application like normal +    let enum_vals = ["fast", "slow"]; +    let m = App::new("myapp") +                    // Use a single positional argument that is required +                    .arg(Arg::from_usage("<foo> 'The Foo to use'") +                        .possible_values(&Foo::variants())) +                    .arg(Arg::from_usage("<speed> 'The speed to use'") +                            // You can define a list of possible values if you want the values to be +                            // displayed in the help information. Whether you use possible_values() or +                            // not, the valid values will ALWAYS be displayed on a failed parse. +                            .possible_values(&enum_vals)) +                    // For the second positional, lets not use possible_values() just to show the difference +                    .arg_from_usage("<oof> 'The Oof to use'") +                    .get_matches(); + +    let t = value_t!(m.value_of("foo"), Foo).unwrap_or_else(|e| e.exit()); +    let t2 = value_t!(m.value_of("oof"), Oof).unwrap_or_else(|e| e.exit()); + + +    // Now we can use our enum like normal. +    match t { +        Foo::Bar => println!("Found a Bar"), +        Foo::Baz => println!("Found a Baz"), +        Foo::Qux => println!("Found a Qux") +    } + +    // Since our Oof derives Debug, we can do this: +    println!("Oof: {:?}", t2); +} | 
