mirror of
https://github.com/vlang/v.git
synced 2025-09-16 16:02:29 +03:00
flag: add custom value descriptions for bool, int, and float flags too (#22032)
This commit is contained in:
parent
42d99ba872
commit
95ff9340ea
2 changed files with 117 additions and 27 deletions
|
@ -311,11 +311,24 @@ fn (mut fs FlagParser) parse_bool_value(longhand string, shorthand u8) !string {
|
||||||
return error("parameter '${longhand}' not found")
|
return error("parameter '${longhand}' not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@[params]
|
||||||
|
pub struct FlagConfig {
|
||||||
|
pub:
|
||||||
|
val_desc string // descriptive string for an argument
|
||||||
|
}
|
||||||
|
|
||||||
// bool_opt returns an option with the bool value of the given command line flag, named `name`.
|
// bool_opt returns an option with the bool value of the given command line flag, named `name`.
|
||||||
// It returns an error, when the flag is not given by the user.
|
// It returns an error, when the flag is not given by the user.
|
||||||
// This version supports abbreviations.
|
// This version supports abbreviations.
|
||||||
pub fn (mut fs FlagParser) bool_opt(name string, abbr u8, usage string) !bool {
|
// This version supports a custom value description.
|
||||||
fs.add_flag(name, abbr, usage, '<bool>')
|
pub fn (mut fs FlagParser) bool_opt(name string, abbr u8, usage string, c FlagConfig) !bool {
|
||||||
|
val_desc := if c.val_desc == '' {
|
||||||
|
'<bool>'
|
||||||
|
} else {
|
||||||
|
c.val_desc
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.add_flag(name, abbr, usage, val_desc)
|
||||||
parsed := fs.parse_bool_value(name, abbr) or {
|
parsed := fs.parse_bool_value(name, abbr) or {
|
||||||
return error("parameter '${name}' not provided")
|
return error("parameter '${name}' not provided")
|
||||||
}
|
}
|
||||||
|
@ -326,16 +339,24 @@ pub fn (mut fs FlagParser) bool_opt(name string, abbr u8, usage string) !bool {
|
||||||
// If that flag is given by the user, then it returns its parsed bool value.
|
// If that flag is given by the user, then it returns its parsed bool value.
|
||||||
// When it is not, it returns the default value in `bdefault`.
|
// When it is not, it returns the default value in `bdefault`.
|
||||||
// This version supports abbreviations.
|
// This version supports abbreviations.
|
||||||
pub fn (mut fs FlagParser) bool(name string, abbr u8, bdefault bool, usage string) bool {
|
// This version supports a custom value description.
|
||||||
value := fs.bool_opt(name, abbr, usage) or { return bdefault }
|
pub fn (mut fs FlagParser) bool(name string, abbr u8, bdefault bool, usage string, c FlagConfig) bool {
|
||||||
|
value := fs.bool_opt(name, abbr, usage, c) or { return bdefault }
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
// int_multi returns all values associated with the provided flag in `name`.
|
// int_multi returns all values associated with the provided flag in `name`.
|
||||||
// When that flag has no values, it returns an empty array.
|
// When that flag has no values, it returns an empty array.
|
||||||
// This version supports abbreviations.
|
// This version supports abbreviations.
|
||||||
pub fn (mut fs FlagParser) int_multi(name string, abbr u8, usage string) []int {
|
// This version supports a custom value description.
|
||||||
fs.add_flag(name, abbr, usage, '<multiple ints>')
|
pub fn (mut fs FlagParser) int_multi(name string, abbr u8, usage string, c FlagConfig) []int {
|
||||||
|
val_desc := if c.val_desc == '' {
|
||||||
|
'<multiple ints>'
|
||||||
|
} else {
|
||||||
|
c.val_desc
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.add_flag(name, abbr, usage, val_desc)
|
||||||
parsed := fs.parse_value(name, abbr)
|
parsed := fs.parse_value(name, abbr)
|
||||||
mut value := []int{}
|
mut value := []int{}
|
||||||
for val in parsed {
|
for val in parsed {
|
||||||
|
@ -347,8 +368,15 @@ pub fn (mut fs FlagParser) int_multi(name string, abbr u8, usage string) []int {
|
||||||
// int_opt returns an option with the integer value, associated with the flag in `name`.
|
// int_opt returns an option with the integer value, associated with the flag in `name`.
|
||||||
// When the flag is not given by the user, it returns an error.
|
// When the flag is not given by the user, it returns an error.
|
||||||
// This version supports abbreviations.
|
// This version supports abbreviations.
|
||||||
pub fn (mut fs FlagParser) int_opt(name string, abbr u8, usage string) !int {
|
// This version supports a custom value description.
|
||||||
fs.add_flag(name, abbr, usage, '<int>')
|
pub fn (mut fs FlagParser) int_opt(name string, abbr u8, usage string, c FlagConfig) !int {
|
||||||
|
val_desc := if c.val_desc == '' {
|
||||||
|
'<int>'
|
||||||
|
} else {
|
||||||
|
c.val_desc
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.add_flag(name, abbr, usage, val_desc)
|
||||||
parsed := fs.parse_value(name, abbr)
|
parsed := fs.parse_value(name, abbr)
|
||||||
if parsed.len == 0 {
|
if parsed.len == 0 {
|
||||||
return error("parameter '${name}' not provided")
|
return error("parameter '${name}' not provided")
|
||||||
|
@ -361,16 +389,24 @@ pub fn (mut fs FlagParser) int_opt(name string, abbr u8, usage string) !int {
|
||||||
// When the flag is given by the user, it returns its parsed integer value.
|
// When the flag is given by the user, it returns its parsed integer value.
|
||||||
// When it is not, it returns the integer value in `idefault`.
|
// When it is not, it returns the integer value in `idefault`.
|
||||||
// This version supports abbreviations.
|
// This version supports abbreviations.
|
||||||
pub fn (mut fs FlagParser) int(name string, abbr u8, idefault int, usage string) int {
|
// This version supports a custom value description.
|
||||||
value := fs.int_opt(name, abbr, usage) or { return idefault }
|
pub fn (mut fs FlagParser) int(name string, abbr u8, idefault int, usage string, c FlagConfig) int {
|
||||||
|
value := fs.int_opt(name, abbr, usage, c) or { return idefault }
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
// float_multi returns all floating point values, associated with the flag named `name`.
|
// float_multi returns all floating point values, associated with the flag named `name`.
|
||||||
// When no values for that flag are found, it returns an empty array.
|
// When no values for that flag are found, it returns an empty array.
|
||||||
// This version supports abbreviations.
|
// This version supports abbreviations.
|
||||||
pub fn (mut fs FlagParser) float_multi(name string, abbr u8, usage string) []f64 {
|
// This version supports a custom value description.
|
||||||
fs.add_flag(name, abbr, usage, '<multiple floats>')
|
pub fn (mut fs FlagParser) float_multi(name string, abbr u8, usage string, c FlagConfig) []f64 {
|
||||||
|
val_desc := if c.val_desc == '' {
|
||||||
|
'<multiple floats>'
|
||||||
|
} else {
|
||||||
|
c.val_desc
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.add_flag(name, abbr, usage, val_desc)
|
||||||
parsed := fs.parse_value(name, abbr)
|
parsed := fs.parse_value(name, abbr)
|
||||||
mut value := []f64{}
|
mut value := []f64{}
|
||||||
for val in parsed {
|
for val in parsed {
|
||||||
|
@ -382,8 +418,15 @@ pub fn (mut fs FlagParser) float_multi(name string, abbr u8, usage string) []f64
|
||||||
// float_opt returns an option with the floating point value, associated with the flag in `name`.
|
// float_opt returns an option with the floating point value, associated with the flag in `name`.
|
||||||
// When the flag is not given by the user, it returns an error.
|
// When the flag is not given by the user, it returns an error.
|
||||||
// This version supports abbreviations.
|
// This version supports abbreviations.
|
||||||
pub fn (mut fs FlagParser) float_opt(name string, abbr u8, usage string) !f64 {
|
// This version supports a custom value description.
|
||||||
fs.add_flag(name, abbr, usage, '<float>')
|
pub fn (mut fs FlagParser) float_opt(name string, abbr u8, usage string, c FlagConfig) !f64 {
|
||||||
|
val_desc := if c.val_desc == '' {
|
||||||
|
'<float>'
|
||||||
|
} else {
|
||||||
|
c.val_desc
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.add_flag(name, abbr, usage, val_desc)
|
||||||
parsed := fs.parse_value(name, abbr)
|
parsed := fs.parse_value(name, abbr)
|
||||||
if parsed.len == 0 {
|
if parsed.len == 0 {
|
||||||
return error("parameter '${name}' not provided")
|
return error("parameter '${name}' not provided")
|
||||||
|
@ -395,17 +438,12 @@ pub fn (mut fs FlagParser) float_opt(name string, abbr u8, usage string) !f64 {
|
||||||
// When the flag is given by the user, it returns its parsed floating point value.
|
// When the flag is given by the user, it returns its parsed floating point value.
|
||||||
// When it is not, it returns the value in `fdefault`.
|
// When it is not, it returns the value in `fdefault`.
|
||||||
// This version supports abbreviations.
|
// This version supports abbreviations.
|
||||||
pub fn (mut fs FlagParser) float(name string, abbr u8, fdefault f64, usage string) f64 {
|
// This version supports a custom value description.
|
||||||
value := fs.float_opt(name, abbr, usage) or { return fdefault }
|
pub fn (mut fs FlagParser) float(name string, abbr u8, fdefault f64, usage string, c FlagConfig) f64 {
|
||||||
|
value := fs.float_opt(name, abbr, usage, c) or { return fdefault }
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
@[params]
|
|
||||||
pub struct FlagConfig {
|
|
||||||
pub:
|
|
||||||
val_desc string // descriptive string for an argument
|
|
||||||
}
|
|
||||||
|
|
||||||
// string_multi returns all string values, associated with the flag named `name`.
|
// string_multi returns all string values, associated with the flag named `name`.
|
||||||
// When no values for that flag are found, it returns an empty array.
|
// When no values for that flag are found, it returns an empty array.
|
||||||
// This version supports abbreviations.
|
// This version supports abbreviations.
|
||||||
|
|
|
@ -194,10 +194,62 @@ fn test_if_no_options_given_usage_message_does_not_contain_options() {
|
||||||
assert !fp.usage().contains('Options:')
|
assert !fp.usage().contains('Options:')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_default_val_descriptions_for_bools() {
|
||||||
|
mut fp := flag.new_flag_parser([])
|
||||||
|
fp.bool('a_bool', `b`, true, '')
|
||||||
|
|
||||||
|
// by default, boolean flags contain no value description
|
||||||
|
assert !fp.usage().contains('<bool>')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_custom_val_descriptions_for_bools() {
|
||||||
|
mut fp := flag.new_flag_parser([])
|
||||||
|
fp.bool('a_bool', `b`, true, '', val_desc: '<custom bool>')
|
||||||
|
|
||||||
|
// a custom boolean value description will be output
|
||||||
|
assert fp.usage().contains('<custom bool>')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_default_val_descriptions_for_ints() {
|
||||||
|
mut fp := flag.new_flag_parser([])
|
||||||
|
fp.int_multi('a_int', `a`, '')
|
||||||
|
fp.int('b_int', `i`, 0, '')
|
||||||
|
|
||||||
|
assert fp.usage().contains('<multiple ints>')
|
||||||
|
assert fp.usage().contains('<int>')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_custom_val_descriptions_for_ints() {
|
||||||
|
mut fp := flag.new_flag_parser([])
|
||||||
|
fp.int_multi('a_int', `a`, '', val_desc: '<multi custom int>')
|
||||||
|
fp.int('b_int', `i`, 0, '', val_desc: '<custom int>')
|
||||||
|
|
||||||
|
assert fp.usage().contains('<multi custom int>')
|
||||||
|
assert fp.usage().contains('<custom int>')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_default_val_descriptions_for_floats() {
|
||||||
|
mut fp := flag.new_flag_parser([])
|
||||||
|
fp.float_multi('a_float', `a`, '')
|
||||||
|
fp.float('b_float', `f`, 0.0, '')
|
||||||
|
|
||||||
|
assert fp.usage().contains('<multiple floats>')
|
||||||
|
assert fp.usage().contains('<float>')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_custom_val_descriptions_for_floats() {
|
||||||
|
mut fp := flag.new_flag_parser([])
|
||||||
|
fp.float_multi('a_float', `a`, '', val_desc: '<multi custom float>')
|
||||||
|
fp.float('b_float', `f`, 0.0, '', val_desc: '<custom float>')
|
||||||
|
|
||||||
|
assert fp.usage().contains('<multi custom float>')
|
||||||
|
assert fp.usage().contains('<custom float>')
|
||||||
|
}
|
||||||
|
|
||||||
fn test_default_val_descriptions_for_strings() {
|
fn test_default_val_descriptions_for_strings() {
|
||||||
mut fp := flag.new_flag_parser([])
|
mut fp := flag.new_flag_parser([])
|
||||||
fp.string_multi('a_string', `a`, '')
|
fp.string_multi('a_string', `a`, '')
|
||||||
fp.string('a_string', `s`, '', '')
|
fp.string('b_string', `s`, '', '')
|
||||||
|
|
||||||
assert fp.usage().contains('<multiple strings>')
|
assert fp.usage().contains('<multiple strings>')
|
||||||
assert fp.usage().contains('<string>')
|
assert fp.usage().contains('<string>')
|
||||||
|
@ -205,11 +257,11 @@ fn test_default_val_descriptions_for_strings() {
|
||||||
|
|
||||||
fn test_custom_val_descriptions_for_strings() {
|
fn test_custom_val_descriptions_for_strings() {
|
||||||
mut fp := flag.new_flag_parser([])
|
mut fp := flag.new_flag_parser([])
|
||||||
fp.string_multi('a_string', `a`, '', val_desc: '<multi custom>')
|
fp.string_multi('a_string', `a`, '', val_desc: '<multi custom string>')
|
||||||
fp.string('a_string', `s`, '', '', val_desc: '<custom>')
|
fp.string('b_string', `s`, '', '', val_desc: '<custom string>')
|
||||||
|
|
||||||
assert fp.usage().contains('<multi custom>')
|
assert fp.usage().contains('<multi custom string>')
|
||||||
assert fp.usage().contains('<custom>')
|
assert fp.usage().contains('<custom string>')
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_free_args_could_be_limited() {
|
fn test_free_args_could_be_limited() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue