Skip to content

Commit b1f34b1

Browse files
authored
Make arrays with default values use their elements' defaultValueDescription (#209)
* Make array arguments/options use their elements' defaultArgumentValue * Add test * Don't wrap the output in square brackets * Change testHelpWithDefaultValues() to expect bracketless array description
1 parent a4e4ae4 commit b1f34b1

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-3
lines changed

Sources/ArgumentParser/Parsable Properties/Argument.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ extension Argument {
377377
initial: { origin, values in
378378
values.set(wrappedValue, forKey: key, inputOrigin: origin)
379379
})
380-
arg.help.defaultValue = !wrappedValue.isEmpty ? "\(wrappedValue)" : nil
380+
arg.help.defaultValue = !wrappedValue.isEmpty ? wrappedValue.defaultValueDescription : nil
381381
return ArgumentSet(alternatives: [arg])
382382
})
383383
}

Sources/ArgumentParser/Parsable Properties/Option.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ extension Option {
506506
var arg = ArgumentDefinition(kind: kind, help: help, parsingStrategy: ArgumentDefinition.ParsingStrategy(parsingStrategy), update: .appendToArray(forType: Element.self, key: key), initial: { origin, values in
507507
values.set(wrappedValue, forKey: key, inputOrigin: origin)
508508
})
509-
arg.help.defaultValue = !wrappedValue.isEmpty ? "\(wrappedValue)" : nil
509+
arg.help.defaultValue = !wrappedValue.isEmpty ? wrappedValue.defaultValueDescription : nil
510510
return ArgumentSet(alternatives: [arg])
511511
})
512512
}

Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,9 @@ extension Float: ExpressibleByArgument {}
6666
extension Double: ExpressibleByArgument {}
6767

6868
extension Bool: ExpressibleByArgument {}
69+
70+
extension Array where Element: ExpressibleByArgument {
71+
var defaultValueDescription: String {
72+
return map { $0.defaultValueDescription }.joined(separator: ", ")
73+
}
74+
}

Tests/ArgumentParserUnitTests/HelpGenerationTests.swift

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ extension HelpGenerationTests {
174174
Your middle name. (default: Winston)
175175
--age <age> Your age. (default: 20)
176176
--logging <logging> Whether logging is enabled. (default: false)
177-
--lucky <numbers> Your lucky numbers. (default: [7, 14])
177+
--lucky <numbers> Your lucky numbers. (default: 7, 14)
178178
--optional/--required Vegan diet. (default: optional)
179179
--degree <degree> Your degree. (default: bachelor)
180180
--directory <directory> Directory. (default: current directory)
@@ -401,4 +401,38 @@ extension HelpGenerationTests {
401401
See 'n help <subcommand>' for detailed help.
402402
""")
403403
}
404+
405+
enum O: String, ExpressibleByArgument {
406+
case small
407+
case medium
408+
case large
409+
410+
init?(argument: String) {
411+
guard let result = Self(rawValue: argument) else {
412+
return nil
413+
}
414+
self = result
415+
}
416+
}
417+
struct P: ParsableArguments {
418+
@Option(name: [.short], help: "Help Message")
419+
var o: [O] = [.small, .medium]
420+
421+
@Argument(help: "Help Message")
422+
var remainder: [O] = [.large]
423+
}
424+
425+
func testHelpWithDefaultValueForArray() {
426+
AssertHelp(for: P.self, equals: """
427+
USAGE: p [-o <o> ...] [<remainder> ...]
428+
429+
ARGUMENTS:
430+
<remainder> Help Message (default: large)
431+
432+
OPTIONS:
433+
-o <o> Help Message (default: small, medium)
434+
-h, --help Show help information.
435+
436+
""")
437+
}
404438
}

0 commit comments

Comments
 (0)