PackageTrack
Sign in Get early access

structopt

Parse command line argument by defining a struct.

0.3.26 87M downloads/mo #881 most downloaded on crates.io TeXitoi/structopt

What this package is like to depend on

Last release 5 years ago

no release in 18 months

Release timing varies

gaps range from 2 weeks to 7 months

Most releases are documented

notes for 48 of 55 stable releases

5 versions withdrawn

withdrawn after publishing

10 years old

60 releases · first in 2017

0 releases in the last 12 months

see the full history below

Release timeline

60 releases · Feb 2017 to Jan 2022
2018 2019 2020 2021 2022 2023 2024 2025 2026
Release Pre-release Withdrawn

Releases

latest 60
  1. 0.3.26 18 Jan 2022

    Nothing published for this version

  2. 0.3.25 18 Oct 2021
    Release notes
    • Fix duplication of aliases in subcommands #504
    Open source →
  3. 0.3.24 18 Oct 2021

    Nothing published for this version

  4. 0.3.23 30 Aug 2021
    Release notes
    Open source →
  5. 0.3.22 04 Jul 2021
    Release notes
    Open source →
  6. 0.3.21 30 Nov 2020
    Release notes
    Open source →
  7. 0.3.20 12 Oct 2020
    Release notes
    • Fixed a breakage when the struct is placed inside a macro_rules! macro.
    Open source →
  8. 0.3.19 08 Oct 2020
    Release notes
    • Added StructOpt::from_args_safe as a shortcut for StructOpt::from_iter_safe(std::env::args_os()).
    • Some links in documentation have been corrected.
    Open source →
  9. 0.3.18 23 Sep 2020
    Release notes
    • Unsafe code has been forbidden. This makes cargo geiger list structopt as "safe". Maybe it will help somebody trying to locate a bug in their dependency tree.
    Open source →
  10. 0.3.17 25 Aug 2020
    Release notes
    • Fixed a breakage with resent rustc versions due to quote_spanned misuse.
    Open source →
  11. 0.3.16 05 Aug 2020
    Release notes
    • Added the new example.
    • Allow #[structopt(flatten)] fields to have doc comments. The comments are ignored.
    • The paw crate is now being reexported when paw feature is enabled, see #407.
    Open source →
  12. 0.3.15 16 Jun 2020
    Release notes
    Open source →
  13. 0.3.14 22 Apr 2020
    Release notes
    • Minor documentation improvements.
    Open source →
  14. 0.3.13 08 Apr 2020
    Release notes
    • Bump proc-macro-error to 1.0.
    Open source →
  15. 0.3.12 18 Mar 2020
    Release notes Open source →
  16. 0.3.11 01 Mar 2020
    Release notes
    • syn's "full" feature is now explicitly enabled. It must have been, but hasn't.
    Open source →
  17. 0.3.10 01 Mar 2020 withdrawn
    Release notes
    • Fixed the breakage due to a required syn feature was not enabled.
    Open source →
  18. 0.3.9 01 Feb 2020 withdrawn
    Release notes
    • clippy warnings triggered by generated code shall not annoy you anymore! Except for those from clippy::correctness, these lints are useful even for auto generated code.
    • Improved error messages.
    Open source →
  19. 0.3.8 19 Jan 2020 withdrawn
    Release notes
    Open source →
  20. 0.3.7 28 Dec 2019
    Release notes

    Nothing's new. Just re-release of v0.3.6 due to the mess with versioning.

    You may notice that structopt-derive was bumped to v0.4.0, that's OK, it's not a breaking change. structopt will pull the right version in on its on.

    Open source →
  21. 0.3.6 22 Dec 2019 withdrawn
    Release notes

    This is unusually big patch release. It contains a number of bugfixes and new features, some of them may theoretically be considered breaking. We did our best to avoid any problems on user's side but, if it wasn't good enough, please file an issue ASAP.

    Bugfixes

    • structopt used to treat ::path::to::type::Vec<T> as Vec<T> special type. This was considered erroneous. (same for Option<T> and bool). Now only exact Vec<T> match is a special type.

    • #[structopt(version = expr)] where expr is not a string literal used to get overridden by auto generated .version() call, incorrectly. Now it doesn't.

    • Fixed bug with top-level App::* calls on multiple structs, see #289.

    • Positional bool args with no explicit #[structopt(parse(...))] annotation are now prohibited. This couldn't work well anyway, see this example for details.

    • Now we've instituted strict priority between doc comments, about, help, and the like. See the documentation.

      HUGE THANKS to @ssokolow for tidying up our documentation, teaching me English and explaining why our doc used to suck. I promise I'll make the rest of the doc up to your standards... sometime later!

    New features

    • Implement StructOpt for Box<impl StructOpt> so from now on you can use Box<T> with flatten and subcommand (#304).

      enum Command {
          #[structopt(name = "version")]
          PrintVersion,
      
          #[structopt(name = "second")]
          DoSomething {
              #[structopt(flatten)]
              config: Box<DoSomethingConfig>,
          },
      
          #[structopt(name = "first")]
          DoSomethingElse {
              #[structopt(flatten)]
              config: Box<DoSomethingElseConfig>,
          }
      }
      
    • Introduced #[structopt(verbatim_doc_comment)] attribute that keeps line breaks in doc comments, see the documentation.

    • Introduced #[structopt(rename_all_env)] and #[structopt(env)] magical methods so you can derive env var's name from field's name. See the documentation.

    Improvements

    • Now we have nice README for our examples, check it out!

    • Some error messages were improved and clarified, thanks for all people involved!

    Open source →
  22. 0.3.5 22 Nov 2019
    Release notes
    • try_from_str functions are now called with a &str instead of a &String (#282)
    Open source →
  23. 0.3.4 08 Nov 2019
    Release notes
    • rename_all does not apply to fields that were annotated with explicit short/long/name = "..." anymore (#265)
    • Now raw idents are handled correctly (#269)
    • Some documentation improvements and clarification.
    Open source →
  24. 0.3.3 10 Oct 2019
    Release notes
    • Add from_flag custom parser to create flags from non-bool types. Fixes #185
    Open source →
  25. 0.3.2 18 Sep 2019
    Release notes
    Open source →
  26. 0.3.1 06 Sep 2019
    Release notes
    • Fix error messages (#241)
    • Fix "skip plus long doc comment" bug (#245)
    • Now structopt emits dummy StructOpt implementation along with an error. It suppresses meaningless errors like from_args method is not found for Opt
    • .version() not get generated if CARGO_PKG_VERSION is not set anymore.
    Open source →
  27. 0.3.0 30 Aug 2019
    Release notes

    Breaking changes

    Bump minimum rustc version to 1.36 by @TeXitoi

    Now rustc 1.36 is the minimum compiler version supported by structopt, it likely won't work with older compilers.

    Remove "nightly" feature

    Once upon a time this feature had been used to enable some of improvements in proc-macro2 crate that were available only on nightly. Nowadays this feature doesn't mean anything so it's now removed.

    Support optional vectors of arguments for distinguishing between -o 1 2, -o and no option provided at all by @sphynx (#180).

    #[derive(StructOpt)]
    struct Opt {
      #[structopt(long)]
      fruit: Option<Vec<String>>,
    }
    
    fn main() {
      assert_eq!(Opt::from_args(&["test"]), None);
      assert_eq!(Opt::from_args(&["test", "--fruit"]), Some(vec![]));
      assert_eq!(Opt::from_args(&["test", "--fruit=apple orange"]), Some(vec!["apple", "orange"]));
    }
    

    If you need to fall back to the old behavior you can use a type alias:

    type Something = Vec<String>;
    
    #[derive(StructOpt)]
    struct Opt {
      #[structopt(long)]
      fruit: Option<Something>,
    }
    

    Change default case from 'Verbatim' into 'Kebab' by @0ndorio (#202).

    structopt 0.3 uses field renaming to deduce a name for long options and subcommands.

    #[derive(StructOpt)]
    struct Opt {
      #[structopt(long)]
      http_addr: String, // will be renamed to `--http-addr`
    
      #[structopt(subcommand)]
      addr_type: AddrType // this adds `addr-type` subcommand
    }
    

    structopt 0.2 used to leave things "as is", not renaming anything. If you want to keep old behavior add #[structopt(rename_all = "verbatim")] on top of a struct/enum.

    Change version, author and about attributes behavior.

    Proposed by @TeXitoi (#217), implemented by @CreepySkeleton (#229).

    structopt have been deducing version, author, and about properties from Cargo.toml for a long time (more accurately, from CARGO_PKG_... environment variables). But many users found this behavior somewhat confusing, and a hack was added to cancel out this behavior: #[structopt(author = "")].

    In structopt 0.3 this has changed.

    • author and about are no longer deduced by default. You should use #[structopt(author, about)] to explicitly request structopt to deduce them.
    • Contrary, version is still deduced by default. You can use #[structopt(no_version)] to cancel it out.
    • #[structopt(author = "", about = "", version = "")] is no longer a valid syntax and will trigger an error.
    • #[structopt(version = "version", author = "author", about = "about")] syntax stays unaffected by this changes.

    Raw attributes are removed (#198) by @sphynx

    In structopt 0.2 you were able to use any method from clap::App and clap::Arg via raw attribute: #[structopt(raw(method_name = "arg"))]. This syntax was kind of awkward.

    #[derive(StructOpt, Debug)]
    #[structopt(raw(
        global_settings = "&[AppSettings::ColoredHelp, AppSettings::VersionlessSubcommands]"
    ))]
    struct Opt {
        #[structopt(short = "l", long = "level", raw(aliases = r#"&["set-level", "lvl"]"#))]
        level: Vec<String>,
    }
    

    Raw attributes were removed in 0.3. Now you can use any method from App and Arg directly:

    #[derive(StructOpt)]
    #[structopt(global_settings(&[AppSettings::ColoredHelp, AppSettings::VersionlessSubcommands]))]
    struct Opt {
        #[structopt(short = "l", long = "level", aliases(&["set-level", "lvl"]))]
        level: Vec<String>,
    }
    

    Improvements

    Support skipping struct fields

    Proposed by @Morganamilo in (#174) implemented by @sphynx in (#213).

    Sometimes you want to include some fields in your StructOpt struct that are not options and clap should know nothing about them. In structopt 0.3 it's possible via the #[structopt(skip)] attribute. The field in question will be assigned with Default::default() value.

    #[derive(StructOpt)]
    struct Opt {
        #[structopt(short, long)]
        speed: f32,
    
        car: String,
    
        // this field should not generate any arguments
        #[structopt(skip)]
        meta: Vec<u64>
    }
    

    Add optional feature to support paw by @gameldar (#187)

    Significantly improve error reporting by @CreepySkeleton (#225)

    Now (almost) every error message points to the location it originates from:

    error: default_value is meaningless for bool
      --> $DIR/bool_default_value.rs:14:24
       |
    14 |     #[structopt(short, default_value = true)]
       |                        ^^^^^^^^^^^^^
    
    Open source →
  28. 0.2.18 26 Jun 2019

    Nothing published for this version

  29. 0.2.17 01 Jun 2019 withdrawn

    Nothing published for this version

  30. 0.2.16 29 May 2019
    Release notes

    Support optional options with optional argument, allowing cmd [--opt[=value]] by @sphynx (#188)

    Sometimes you want to represent an optional option that optionally takes an argument, i.e [--opt[=value]]. This is represented by Option<Option<T>>

    #[derive(StructOpt)]
    struct Opt {
      #[structopt(long)]
      fruit: Option<Option<String>>,
    }
    
    fn main() {
      assert_eq!(Opt::from_args(&["test"]), None);
      assert_eq!(Opt::from_args(&["test", "--fruit"]), Some(None));
      assert_eq!(Opt::from_args(&["test", "--fruit=apple"]), Some("apple"));
    }
    
    Open source →
  31. 0.2.15 08 Mar 2019
    Release notes
    Open source →
  32. 0.2.14 10 Dec 2018
    Release notes
    • Introduce smarter parsing of doc comments by @0ndorio
    Open source →
  33. 0.2.13 01 Nov 2018
    Release notes
    • Automatic naming of fields and subcommands by @0ndorio
    Open source →
  34. 0.2.12 11 Oct 2018
    Release notes
    Open source →
  35. 0.2.11 05 Oct 2018
    Release notes
    Open source →
  36. 0.2.10 07 Jun 2018
    Release notes
    • 1.21.0 is the minimum required rustc version by @TeXitoi
    Open source →
  37. 0.2.9 05 Jun 2018
    Release notes
    • Fix a bug when using flatten by @fbenkstein
    • Update syn, quote and proc_macro2 by @TeXitoi
    • Fix a regression when there is multiple authors by @windwardly
    Open source →
  38. 0.2.8 28 Apr 2018
    Release notes
    • Add StructOpt::from_iter_safe(), which returns an Error instead of killing the program when it fails to parse, or parses one of the short-circuiting flags. (#98 by @quodlibetor)
    • Allow users to enable clap features independently by @Kerollmops
    • Fix a bug when flattening an enum (#103 by @TeXitoi
    Open source →
  39. 0.2.7 12 Apr 2018
    Release notes
    • Add flattening, the insertion of options of another StructOpt struct into another (#92) by @birkenfeld
    • Fail compilation when using default_value or required with Option (#88) by @Kerollmops
    Open source →
  40. 0.2.6 31 Mar 2018
    Release notes
    • Fail compilation when using default_value or required with bool (#80) by @TeXitoi
    • Fix compilation with #[deny(warnings)] with the ! type (https://github.com/rust-lang/rust/pull/49039#issuecomment-376398999) by @TeXitoi
    • Improve first example in the documentation (#82) by @TeXitoi
    Open source →
  41. 0.2.5 07 Mar 2018
    Release notes
    Open source →
  42. 0.2.4 25 Feb 2018
    Release notes
    Open source →
  43. 0.2.3 16 Feb 2018
    Release notes
    • An empty line in a doc comment will result in a double linefeed in the generated about/help call by @TeXitoi
    Open source →
  44. 0.2.2 12 Feb 2018
    Release notes
    Open source →
  45. 0.2.1 11 Feb 2018
    Release notes
    • Fix a bug around enum tuple and the about message in the global help by @TeXitoi
    • Fix #65 by @TeXitoi
    Open source →
  46. 0.2.0 10 Feb 2018
    Release notes

    Breaking changes

    Don't special case u64 by @SergioBenitez

    If you are using a u64 in your struct to get the number of occurrence of a flag, you should now add parse(from_occurrences) on the flag.

    For example

    #[structopt(short = "v", long = "verbose")]
    verbose: u64,
    

    must be changed by

    #[structopt(short = "v", long = "verbose", parse(from_occurrences))]
    verbose: u64,
    

    This feature was surprising as shown in #30. Using the parse feature seems much more natural.

    Change the signature of Structopt::from_clap to take its argument by reference by @TeXitoi

    There was no reason to take the argument by value. Most of the StructOpt users will not be impacted by this change. If you are using StructOpt::from_clap, just add a & before the argument.

    Fail if attributes are not used by @TeXitoi

    StructOpt was quite fuzzy in its attribute parsing: it was only searching for interesting things, e. g. something like #[structopt(foo(bar))] was accepted but not used. It now fails the compilation.

    You should have nothing to do here. This breaking change may highlight some misuse that can be bugs.

    In future versions, if there is cases that are not highlighted, they will be considerated as bugs, not breaking changes.

    Use raw() wrapping instead of _raw suffixing by @TeXitoi

    The syntax of raw attributes is changed to improve the syntax.

    You have to change foo_raw = "bar", baz_raw = "foo" by raw(foo = "bar", baz = "foo") or raw(foo = "bar"), raw(baz = "foo").

    New features

    • Add parse(from_occurrences) parser by @SergioBenitez
    • Support 1-uple enum variant as subcommand by @TeXitoi
    • structopt-derive crate is now an implementation detail, structopt reexport the custom derive macro by @TeXitoi
    • Add the StructOpt::from_iter method by @Kerollmops

    Documentation

    • Improve doc by @bestouff
    • All the documentation is now on the structopt crate by @TeXitoi
    Open source →
    Release notes

    Breaking changes

    Don't special case u64 by @SergioBenitez

    If you are using a u64 in your struct to get the number of occurence of a flag, you should now add parse(from_occurrences) on the flag.

    For example

    #[structopt(short = "v", long = "verbose")]
    verbose: u64,
    

    must be changed by

    #[structopt(short = "v", long = "verbose", parse(from_occurrences))]
    verbose: u64,
    

    This feature was surprising as shown in #30. Using the parse feature seems much more natural.

    Change the signature of Structopt::from_clap to take its argument by reference by @TeXitoi

    There was no reason to take the argument by value. Most of the StructOpt users will not be impacted by this change. If you are using StructOpt::from_clap, just add a & before the argument.

    Fail if attributes are not used by @TeXitoi

    StructOpt was quite fuzzy in its attribute parsing: it was only searching for interresting things, e. g. something like #[structopt(foo(bar))] was accepted but not used. It now fails the compilation.

    You should have nothing to do here. This breaking change may highlight some missuse that can be bugs.

    In future versions, if there is cases that are not highlighed, they will be considerated as bugs, not breaking changes.

    Use raw() wrapping instead of _raw suffixing by @TeXitoi

    The syntax of raw attributes is changed to improve the syntax.

    You have to change foo_raw = "bar", baz_raw = "foo" by raw(foo = "bar", baz = "foo") or raw(foo = "bar"), raw(baz = "foo").

    New features

    • Add parse(from_occurrences) parser by @SergioBenitez
    • Support 1-uple enum variant as subcommand by @TeXitoi
    • structopt-derive crate is now an implementation detail, structopt reexport the custom derive macro by @TeXitoi
    • Add the StructOpt::from_iter method by @Kerollmops

    Documentation

    • Improve doc by @bestouff
    • All the documentation is now on the structopt crate by @TeXitoi
    Open source →
  47. 0.1.7 23 Jan 2018
    Release notes
    • Allow opting out of clap default features by @ski-csis
    Open source →
  48. 0.1.6 25 Nov 2017
    Release notes
    Open source →
  49. 0.1.5 14 Nov 2017
    Release notes
    • Fix a bug with optional subsubcommand and Enum by @TeXitoi
    Open source →
  50. 0.1.4 09 Nov 2017
    Release notes
    • Implement custom string parser from either &str or &OsStr by @kennytm
    Open source →
  51. 0.1.3 01 Nov 2017
    Release notes
    Open source →
  52. 0.1.2 01 Nov 2017
    Release notes
    • Fix bugs #24 and #25 by @TeXitoi
    • Support of methods with something else that a string as argument thanks to _raw suffix by @Flakebi
    Open source →
  53. 0.1.1 22 Sep 2017
    Release notes
    • Better formatting of multiple authors by @killercup
    Open source →
    Release notes
    • Better formating of multiple authors by @killercup
    Open source →
  54. 0.1.0 17 Jul 2017
    Release notes
    Open source →
  55. 0.0.5 16 Jun 2017
    Release notes
    • Using doc comment to populate help by @killercup
    Open source →
  56. 0.0.4 16 Jun 2017

    Nothing published for this version

  57. 0.0.3 11 Feb 2017
    Release notes
    • First version with flags, arguments and options support by @TeXitoi
    Open source →
  58. 0.0.2 10 Feb 2017

    Nothing published for this version

  59. 0.0.1 10 Feb 2017

    Nothing published for this version

  60. 0.0.0 03 Feb 2017

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive