diff --git a/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift b/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift index eb4590852..240f0820a 100644 --- a/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift +++ b/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift @@ -60,6 +60,12 @@ extension ExpressibleByArgument where Self: CaseIterable, Self: RawRepresentable } } +extension ExpressibleByArgument where Self: RawRepresentable, RawValue == String { + public var defaultValueDescription: String { + rawValue + } +} + extension String: ExpressibleByArgument { public init?(argument: String) { self = argument diff --git a/Tests/ArgumentParserUnitTests/DumpHelpGenerationTests.swift b/Tests/ArgumentParserUnitTests/DumpHelpGenerationTests.swift index f207ac929..f6c119e83 100644 --- a/Tests/ArgumentParserUnitTests/DumpHelpGenerationTests.swift +++ b/Tests/ArgumentParserUnitTests/DumpHelpGenerationTests.swift @@ -22,12 +22,15 @@ final class DumpHelpGenerationTests: XCTestCase { extension DumpHelpGenerationTests { struct A: ParsableCommand { enum TestEnum: String, CaseIterable, ExpressibleByArgument { - case a, b, c + case a = "one", b = "two", c = "three" } @Option var enumeratedOption: TestEnum + @Option + var enumeratedOptionWithDefaultValue: TestEnum = .b + @Option var noHelpOption: Int @@ -80,9 +83,9 @@ extension DumpHelpGenerationTests { "arguments" : [ { "allValues" : [ - "a", - "b", - "c" + "one", + "two", + "three" ], "isOptional" : false, "isRepeating" : false, @@ -100,6 +103,29 @@ extension DumpHelpGenerationTests { "shouldDisplay" : true, "valueName" : "enumerated-option" }, + { + "allValues" : [ + "one", + "two", + "three" + ], + "defaultValue" : "two", + "isOptional" : true, + "isRepeating" : false, + "kind" : "option", + "names" : [ + { + "kind" : "long", + "name" : "enumerated-option-with-default-value" + } + ], + "preferredName" : { + "kind" : "long", + "name" : "enumerated-option-with-default-value" + }, + "shouldDisplay" : true, + "valueName" : "enumerated-option-with-default-value" + }, { "isOptional" : false, "isRepeating" : false, diff --git a/Tests/ArgumentParserUnitTests/HelpGenerationTests.swift b/Tests/ArgumentParserUnitTests/HelpGenerationTests.swift index cc2e3a8e9..f963d89e5 100644 --- a/Tests/ArgumentParserUnitTests/HelpGenerationTests.swift +++ b/Tests/ArgumentParserUnitTests/HelpGenerationTests.swift @@ -174,11 +174,30 @@ extension HelpGenerationTests { @Option(help: "Directory.") var directory: URL = URL(fileURLWithPath: FileManager.default.currentDirectoryPath) + + enum Manual: Int, ExpressibleByArgument { + case foo + var defaultValueDescription: String { "default-value" } + } + @Option(help: "Manual Option.") + var manual: Manual = .foo + + enum UnspecializedSynthesized: Int, CaseIterable, ExpressibleByArgument { + case one, two + } + @Option(help: "Unspecialized Synthesized") + var unspecial: UnspecializedSynthesized = .one + + enum SpecializedSynthesized: String, CaseIterable, ExpressibleByArgument { + case apple = "Apple", banana = "Banana" + } + @Option(help: "Specialized Synthesized") + var special: SpecializedSynthesized = .apple } func testHelpWithDefaultValues() { AssertHelp(.default, for: D.self, equals: """ - USAGE: d [] [--name ] [--age ] [--logging ] [--lucky ...] [--optional] [--required] [--degree ] [--directory ] + USAGE: d [] [--name ] [--age ] [--logging ] [--lucky ...] [--optional] [--required] [--degree ] [--directory ] [--manual ] [--unspecial ] [--special ] ARGUMENTS: Your occupation. (default: --) @@ -191,6 +210,9 @@ extension HelpGenerationTests { --optional/--required Vegan diet. (default: optional) --degree Your degree. (default: bachelor) --directory Directory. (default: current directory) + --manual Manual Option. (default: default-value) + --unspecial Unspecialized Synthesized (default: one) + --special Specialized Synthesized (default: Apple) -h, --help Show help information. """)