Closed x10an14 closed 7 months ago
Switches can be merged together:
-tv parsed as -t -v
Using the following Option class
class Options
{
[Option('v')]
public string Verbose { get; set; }
}
The commandline:
-vv =parsed to=> -v v =result to=> options.verbose = "v"
-vvv =parsed to=> -v vv =result to=> options.verbose = "vv"
-v raise error `Option 'v' has no value.`
Thanks! =)
Oh wait, I was a bit hasty, sorry!
-v raise error Option 'v' has no value.
Is that a necessity? It's not possible to give the flag -v
(and just -v
), and therefore set verbosityLevel
to 1
as opposed to a default of 0?
Edit: To clarify, I'm under the impression now that what I quoted of your answer is something decided by the framework, not just an implementation detail you suggested.
Verbose is defined as string not bool (so it's a Scalar option not a boolean Switch ) to accept string values as described above. Any scalar option should have a value in the commandline.
it's not possible to give the flag -v (and just -v), and therefore set verbosityLevel to 1 as opposed to a default of 0?
Do you mean: -v1 => -v 1 -v2 => -v 2
in that case Verbose can be integer.
Just to clarify (but I think we understand each other now):
"<nothing" => "verbosity level 0"
"-v" => "verbosity level 1"
"-vv" => "verbosity level 2"
"-vvv" => "verbosity level 3"
That's as easy as;
class Options
{
[Option(
'v',
MetaName = "verbosity")]
public uint Verbosity { get; set; }
}
?
In that case, verbose will be uint : v1 or v2 or v3 and no way to map against -v or -vv or -vvv Just, a trick, if you want to use triple vvv:
enum VerboseEnum
{
v =1,
vv,
vvv
}
class Options
{
[Option(
'v',
MetaName = "verbosity",
Default=VerboseEnum.v)]
public VerboseEnum Verbosity { get; set; }
}
The command can be:
-vv /-vvv /-vvvv
That is Quad verbosity not a triple ;) :)
Edit in case of enum, you can use both int and enum, all are valid:
-v1 or -vv
-v2 or -vvv
-v3 or -vvvv
I'm still not getting it =/
Here's a reference of how Rust's Structopt
1 (based on Clap
2) enables the same feature as I'm asking for
1: https://github.com/TeXitoi/structopt 2: https://github.com/clap-rs/clap
I'm still not getting it
--
[Option( 'v',
HelpText = "Verbosity level: v or vv or vvv Or int values 1 or 2 or 3",
Default=VerbosityEnum.v)]
public VerbosityEnum Verbosity { get; set; }
Commandline Arguments can be:
-vv //its 'v v' with VerbosityLevel: v or 1
-vvv //its 'v vv' with VerbosityLevel: vv or 2
-vvvv //its 'v vvv' with VerbosityLevel: vvv or 3
//using int values
-v1 //its 'v v' with VerbosityLevel: v or 1
-v2 //its 'v vv' with VerbosityLevel: vv or 2
-v3 //its 'v vvv' with VerbosityLevel: vvv or 3
//no argument, so use default value: v or 1
//-v //Not allowed, raise error: Option 'v' has no value.
//note: don't use the prefix doubledash -- before args
Working Demo: Try it online
Edit:
clab in Rust define the argument verbose with short_name(v) and compute the number of occurrence of the command (e.g for vvv ==>occurrence =3) using a method matches.occurrences_of (v)
rename "term limit" to results limit, or else add both ngrams limit and results limit
this is also per brad's feedback
This issue seems to have been fixed by #684
You need to set FlagCounter=true
in the attribute and enable GetoptMode on the parser. (there seems to have been some talk about changing GetoptMode to an enum instead in the future, see #690)
var parser = new Parser(with =>
{
with.GetoptMode = true;
});
...
class Options
{
[Option('v', FlagCounter = true, HelpText = "Verbosity level: v or vv, vvv or vvvv")]
public int Verbosity { get; set; }
}
Online demo: https://dotnetfiddle.net/E8Q3sL
I'm not sure whether or not what I describe is part of the GNU getopt standard.
But
ssh
is a good example for what I'm trying to do.Anyone using Github can perform the following (as long as they've set-up SSH keys):
And....
Long SSH example output
```bash -> $ ssh -Tvv git@github.com OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 7 Dec 2017 debug1: Reading configuration data /home/x10an14/.ssh/config debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug2: resolving "github.com" port 22 debug2: ssh_connect_direct: needpriv 0 debug1: Connecting to github.com [140.82.118.4] port 22. debug1: Connection established. debug1: identity file /home/x10an14/.ssh/id_rsa type 0 debug1: key_load_public: No such file or directory debug1: identity file /home/x10an14/.ssh/id_rsa-cert type -1 debug1: key_load_public: No such file or directory debug1: identity file /home/x10an14/.ssh/id_dsa type -1 debug1: key_load_public: No such file or directory debug1: identity file /home/x10an14/.ssh/id_dsa-cert type -1 debug1: key_load_public: No such file or directory debug1: identity file /home/x10an14/.ssh/id_ecdsa type -1 debug1: key_load_public: No such file or directory debug1: identity file /home/x10an14/.ssh/id_ecdsa-cert type -1 debug1: key_load_public: No such file or directory debug1: identity file /home/x10an14/.ssh/id_ed25519 type -1 debug1: key_load_public: No such file or directory debug1: identity file /home/x10an14/.ssh/id_ed25519-cert type -1 debug1: Local version string SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3 debug1: Remote protocol version 2.0, remote software version babeld-003ebee6 debug1: no match: babeld-003ebee6 debug2: fd 3 setting O_NONBLOCK debug1: Authenticating to github.com:22 as 'git' debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug2: local client KEXINIT proposal debug2: KEX algorithms: curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1,ext-info-c debug2: host key algorithms: ssh-rsa-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519 debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1 debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1 debug2: compression ctos: none,zlib@openssh.com,zlib debug2: compression stoc: none,zlib@openssh.com,zlib debug2: languages ctos: debug2: languages stoc: debug2: first_kex_follows 0 debug2: reserved 0 debug2: peer server KEXINIT proposal debug2: KEX algorithms: curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256 debug2: host key algorithms: ssh-dss,rsa-sha2-512,rsa-sha2-256,ssh-rsa debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc debug2: MACs ctos: hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1 debug2: MACs stoc: hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1 debug2: compression ctos: none,zlib,zlib@openssh.com debug2: compression stoc: none,zlib,zlib@openssh.com debug2: languages ctos: debug2: languages stoc: debug2: first_kex_follows 0 debug2: reserved 0 debug1: kex: algorithm: curve25519-sha256 debug1: kex: host key algorithm: rsa-sha2-512 debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC:So in short, I can supply
-v
,-vv
, or-vvv
to thessh
command, and get increasing levels of verbosity. I enjoy the opportunity to supply-v (--verbose)
and-q (--quiet)
flags in CLIs I implement.