flag: add optional value description to string parameters (#22024)

This commit is contained in:
Kim Shrier 2024-08-11 04:01:41 -06:00 committed by GitHub
parent c51d30bf53
commit 20a525ae74
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 45 additions and 6 deletions

View file

@ -400,19 +400,39 @@ pub fn (mut fs FlagParser) float(name string, abbr u8, fdefault f64, usage strin
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.
pub fn (mut fs FlagParser) string_multi(name string, abbr u8, usage string) []string { // This version supports a custom value description.
fs.add_flag(name, abbr, usage, '<multiple strings>') pub fn (mut fs FlagParser) string_multi(name string, abbr u8, usage string, c FlagConfig) []string {
val_desc := if c.val_desc == '' {
'<multiple strings>'
} else {
c.val_desc
}
fs.add_flag(name, abbr, usage, val_desc)
return fs.parse_value(name, abbr) return fs.parse_value(name, abbr)
} }
// string_opt returns an option with the string value, associated with the flag in `name`. // string_opt returns an option with the string 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) string_opt(name string, abbr u8, usage string) !string { // This version supports a custom value description.
fs.add_flag(name, abbr, usage, '<string>') pub fn (mut fs FlagParser) string_opt(name string, abbr u8, usage string, c FlagConfig) !string {
val_desc := if c.val_desc == '' {
'<string>'
} 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")
@ -424,8 +444,9 @@ pub fn (mut fs FlagParser) string_opt(name string, abbr u8, usage string) !strin
// If that flag is given as an option, then its parsed value is returned as a string. // If that flag is given as an option, then its parsed value is returned as a string.
// When it is not, it returns the default string value in `sdefault`. // When it is not, it returns the default string value in `sdefault`.
// This version supports abbreviations. // This version supports abbreviations.
pub fn (mut fs FlagParser) string(name string, abbr u8, sdefault string, usage string) string { // This version supports a custom value description.
value := fs.string_opt(name, abbr, usage) or { return sdefault } pub fn (mut fs FlagParser) string(name string, abbr u8, sdefault string, usage string, c FlagConfig) string {
value := fs.string_opt(name, abbr, usage, c) or { return sdefault }
return value return value
} }

View file

@ -194,6 +194,24 @@ 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_strings() {
mut fp := flag.new_flag_parser([])
fp.string_multi('a_string', `a`, '')
fp.string('a_string', `s`, '', '')
assert fp.usage().contains('<multiple strings>')
assert fp.usage().contains('<string>')
}
fn test_custom_val_descriptions_for_strings() {
mut fp := flag.new_flag_parser([])
fp.string_multi('a_string', `a`, '', val_desc: '<multi custom>')
fp.string('a_string', `s`, '', '', val_desc: '<custom>')
assert fp.usage().contains('<multi custom>')
assert fp.usage().contains('<custom>')
}
fn test_free_args_could_be_limited() { fn test_free_args_could_be_limited() {
mut fp1 := flag.new_flag_parser(['a', 'b', 'c']) mut fp1 := flag.new_flag_parser(['a', 'b', 'c'])
fp1.limit_free_args(1, 4)! fp1.limit_free_args(1, 4)!