Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for negative boolean flags #280

Closed
vmalloc opened this issue Nov 20, 2019 · 9 comments
Closed

Add support for negative boolean flags #280

vmalloc opened this issue Nov 20, 2019 · 9 comments

Comments

@vmalloc
Copy link
Contributor

vmalloc commented Nov 20, 2019

Apologies if this is a duplicate or has already been requested -- but it would be nice to have a way to set a boolean flag which defaults to true unless it is given (e.g. --no-do-something would set the do_something field to false, otherwise it would be true)

@CreepySkeleton
Copy link
Collaborator

That would be clap's feature, you should open an issue there instead. Typically, if you have a feature request that adds some functionality to clap::App/Arg you should go there, not here. If it would require explicit support in structopt we'll be happy to do that but we need it implemented in clap::Arg in the first place.

By the way, there's such a request already, feel free to send a PR.

@TeXitoi
Copy link
Owner

TeXitoi commented Nov 20, 2019

As of today, you can also do the machinery by hand, I.e. creating a no-do-something flag on a do_something field, with a custom from_flag.

I'm on mobile, I'll try to write such an example within the day.

@vmalloc
Copy link
Contributor Author

vmalloc commented Nov 20, 2019

@CreepySkeleton I see. Thanks for the reply, and sorry for the spam!

@TeXitoi
Copy link
Owner

TeXitoi commented Nov 20, 2019

use structopt::StructOpt;

#[derive(Debug, StructOpt)]
struct Opt {
    #[structopt(long = "no-verbose", parse(from_flag = std::ops::Not::not))]
    verbose: bool,
}
fn main() {
    let cmd = Opt::from_args();
    println!("{:#?}", cmd); 
}

@vmalloc
Copy link
Contributor Author

vmalloc commented Nov 20, 2019

@TeXitoi awesome! Going to add it to my personal cookbook. That is exactly what I needed.

Thank you very much!

@TeXitoi
Copy link
Owner

TeXitoi commented Nov 20, 2019

Example proposed in #281

TeXitoi added a commit that referenced this issue Nov 26, 2019
Dylan-DPC-zz pushed a commit to clap-rs/clap_derive that referenced this issue Jan 7, 2020
* Automatic naming of fields and subcommands (#143)

* Introduce smarter parsing of doc comments. (#146)

* Fix invalid structopt syntax error message (#154)

There was a typo preventing the probematic attr to be shown to the user.

* Fix spelling: occurences -> occurrences, (#158)

was found in comments and code, but required no user-facing API change.

* Remove line-ending periods from short help. (#161)

* Fix #168

* Support Option<Option<T>> field types (#190)

* Support Option<Vec<T>> field type (#191)

* Fix use of deprecated function

* Fix some clippy lints

* Update deprecated function and provide more info about the parsing error (#193)

* Improve ChangeLog as suggested by @ErichDonGubler (#194)

* [Casing] Change default from verbatim to kebab. (#204)

.. fixes TeXitoi/structopt#202

* Use trybuild for testing expected proc macro errors (#205)

* Custom attributes parser (#198)

* update README.md for 0.3

fix #208

* Small fixes: clippy and typos (#215)

* Add example for environment variables (#160) (#216)

* Support skipping struct fields (#213)

* Now error messages highlight the error location (#225)

* Minor fixes

* Change behavior of `about/author/version` and ad `no_version`

* Emit error about `raw` removal

* Update changelog

* Update keyvalue example (#234)

* Update documentation and changelog (#236)

* Update dependencies (#227)

* Bump minimum rustc version to 1.36

* Fix issues

* Fix structopt-derive permissions (#239)

* Fix #245 (#246)

* Emit dummy impls on error (#248)

* Fix changelog example (#250)

* Do not call .verison() when CARGO_PKG_VERSION is not set

* Update and improve docs

* Propagate span info from origin code to generated code

Most of `quote!` invocations are replaced with `quote_spanned!` ones.
Now everywhere - sometimes it's pointless, sometimes we don't have
any meaningless location to toke a span from, sometimes I just can't
workaround the current implementation - too much changes.

* Fix nightly tests

* Do not mangle `author` string inside `<...>`

* Support `skip = value` syntax

* Fix code formatting

* Fix nightly tests

* Run ui tests only on stable

* Add from_flag parser (#271)

* Clarify docs and error messages (#277)

* Fix parse for OptionVec (#279)

ref pull #191

* Fix #269 and #265 (#278)

* Pass the try_from_str functions a &str instead of a &String. (#282)

In most cases this doesn't matter, as &String is coerced to a &str, but
this fails for generic functions like CString::new.

* Add an example of a negative flag (i.e. --no-verbose)

Question from TeXitoi/structopt#280

* Fix #283 (#284)

Fix #283

* Add `examples/README.md` and do some cleanup

* Handle special types correctly

* cargo clippy

* Handle inter-expansion top-level args properly

* Cleanup tests

* Update proc-macro-error to v0.4

* Offer helpful suggestion on `raw(...)` error

* Add `after_help` example

* Prohibit positional `bool` args

* Add tests/utils.rs

* fixed typo, removed misleading doc

* Remove CHANGELOG additions

* Rust 2018

* Addressed review

Co-authored-by: rnd <[email protected]>
Co-authored-by: Robin Lambertz <[email protected]>
Co-authored-by: florianjacob <[email protected]>
Co-authored-by: Ted Driggs <[email protected]>
Co-authored-by: Guillaume P. <[email protected]>
Co-authored-by: Ivan Veselov <[email protected]>
Co-authored-by: Owen Walpole <[email protected]>
Co-authored-by: Robin Stocker <[email protected]>
Co-authored-by: CreepySkeleton <[email protected]>
Co-authored-by: Ophir LOJKINE <[email protected]>
Co-authored-by: kpcyrd <[email protected]>
Co-authored-by: Luiz F. A. de Prá <[email protected]>
Co-authored-by: Andy Weiss <[email protected]>
Co-authored-by: xiaoniu-578fa6bff964d005 <[email protected]>
Co-authored-by: Mara Bos <[email protected]>
Co-authored-by: Renê Couto e Silva <[email protected]>
@ghost
Copy link

ghost commented Sep 26, 2020

@TeXitoi
Hi, thank you for your great example.

I have an question, can I use switching flag...?

    #[structopt(long = "verbose")]
    #[structopt(long = "no-verbose", parse(from_flag = std::ops::Not::not))]
    pub verbose: bool,

// Of course this doesn't work, verbose gone away.

Looking at an issue #320 and #126, it looks not implemented yet.
But the issue is two years ago, so I wonder it actually implemented now.

@TeXitoi
Copy link
Owner

TeXitoi commented Sep 27, 2020

It's not. But you can do with 2 field, a verbose and a quiet, and implement a getter on your struct that read the 2 fields to decide what to return.

@ghost
Copy link

ghost commented Sep 27, 2020

@TeXitoi
Thank you for answer.
I got it. Thank you very much!

andrewsmith added a commit to andrewsmith/squawk that referenced this issue Jan 20, 2023
Previously, this could only be specified with a value:

--assume-in-transaction=true
--assume-in-transaction=false

I found prior art [1] for doing a boolean flag in structopt using two
fields. It isn't as elegant as I would have hoped for, but one can now
use:

--assume-in-transaction
--no-assume-in-transaction

which is more common in my experience.

[1]: TeXitoi/structopt#280.
andrewsmith added a commit to andrewsmith/squawk that referenced this issue Jan 20, 2023
Previously, this could only be specified with a value:

--assume-in-transaction=true
--assume-in-transaction=false

I found prior art [1] for doing a boolean flag in structopt using two
fields. It isn't as elegant as I would have hoped for, but one can now
use:

--assume-in-transaction
--no-assume-in-transaction

which is more common in my experience.

[1]: TeXitoi/structopt#280.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants