GithubHelp home page GithubHelp logo

Allow flags to come after arguments about cli HOT 11 OPEN

fiatjaf avatar fiatjaf commented on August 15, 2024 7
Allow flags to come after arguments

from cli.

Comments (11)

fiatjaf avatar fiatjaf commented on August 15, 2024 1

It's not.

from cli.

dearchap avatar dearchap commented on August 15, 2024 1

@fiatjaf Please make sure that there is a field that can be set in Command to enable the behavior. Also make sure you have test cases for

cmd subcmd1 subcmd2 -f -s -X

where subcmd1 defines these flags and redorder is configured ONLY on that subcommand. Unless you are strictly expected this usage only for single level subcmd. I anticipate that people will ask why it does not work for 2-3 level sub commands. This has to be thought out more thoroughly.

from cli.

XANi avatar XANi commented on August 15, 2024

Additional context:

With multi-command binaries it's pretty common pattern to do the "config the command" first:

cli --server 1.2.3.4 --password-file ~/.cli/production.creds

and then when using it to just put subcommand after

cli --server 1.2.3.4 --password-file ~/.cli/production.creds ls --help

cli --server 1.2.3.4 --password-file ~/.cli/production.creds show

cli --server 1.2.3.4 --password-file ~/.cli/production.creds show --filter asd

or outright alias it

alias cli-prod cli --server 1.2.3.4 --password-file ~/.cli/production.creds

cli-prod ls --help

cli-prod show

cli-prod --filter asd

"POSIX compatbile" is not good. People are not POSIX compatible.

from cli.

BlackHole1 avatar BlackHole1 commented on August 15, 2024

In v3(alpha), this is already supported. You can verify it using: go get github.com/urfave/cli/v3.

Related PR: #1568 #1835

from cli.

decentral1se avatar decentral1se commented on August 15, 2024

@BlackHole1 #1717 (comment) #976 (comment)

from cli.

dearchap avatar dearchap commented on August 15, 2024

Additional context:

With multi-command binaries it's pretty common pattern to do the "config the command" first:

cli --server 1.2.3.4 --password-file ~/.cli/production.creds

and then when using it to just put subcommand after

cli --server 1.2.3.4 --password-file ~/.cli/production.creds ls --help

cli --server 1.2.3.4 --password-file ~/.cli/production.creds show

cli --server 1.2.3.4 --password-file ~/.cli/production.creds show --filter asd

or outright alias it

alias cli-prod cli --server 1.2.3.4 --password-file ~/.cli/production.creds

cli-prod ls --help

cli-prod show

cli-prod --filter asd

"POSIX compatbile" is not good. People are not POSIX compatible.

@XANi I dont see how your example relates to this issue.

from cli.

fiatjaf avatar fiatjaf commented on August 15, 2024

This is my feature request, that PR is just one possible but humble attempt at implementing it. I'm sure people with more experience with this code can deal with this better, hence this feature request.

from cli.

dearchap avatar dearchap commented on August 15, 2024

@fiatjaf you may submit the PR and we can merge it but eventually over time it is upto the maintainers to maintain this code and move it forward. So I want to make sure we have a firm foundation since this is not a simple feature.

from cli.

decentral1se avatar decentral1se commented on August 15, 2024

Thanks for weighing in @dearchap 🎉

I'm trying to think through an example which allows a ReorderFlags: true to be set on the root command which is then propagated to all sub-commands. If we take the following example:

# rough definition
cli [--global] sub1 [--foo] sub2 [--bar] sub3 [--baz] arg1

# user chaotically types while hacking
cli sub1 sub2 --foo sub3 --bar arg1 --baz --global

# transparently reordered
cli --global sub1 --foo sub2 --bar sub3 --baz arg1

Then the re-order logic is "just": parse flags and return them to the position where they are "registered", i.e. Flags: []cli.Flag{fooFlag}. There is no guessing what the user wants and we follow the logic of the *cli.Command.

We just need to figure out a precedence convention for flag names overlapping? Perhaps it is "local wins"?

Thoughts?

from cli.

dearchap avatar dearchap commented on August 15, 2024

@decentral1se Thank you for the example. The example supposes that these are bool flags correct ? If you had this

cli sub1 sub2 --foo 10 sub3 --bar arg1 --baz --global

for example we wouldnt reorder since foo is an int flag ? It starts getting tricky. So say we support only bool flags and we have shortoptionshandling enabled we would need to parse out

cli [--global] sub1 [-f] sub2 [-b] sub3 [-z] arg1
cli sub1 sub2 sub3 arg1 --global -fbz

to 

cli --global sub1 -f sub2 -b sub3 -z arg1

I think we need to start working on #1273 which would provide a foundation for this behavior. One of pre-exec functions would allow users to add flags dynamically and another of those pre-exec functions would do reordering.

from cli.

decentral1se avatar decentral1se commented on August 15, 2024

@dearchap that's a good point about non-bool flags. Yeh, I guess it's just the same rule: follow what is registered on the flag (vs. the command this time) - does it accept an argument? then bring that with the sort? Will try manual test along with #1928 great work @fiatjaf

from cli.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.