diff --git a/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift b/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift index f516ca102..683ea6cde 100644 --- a/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift +++ b/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift @@ -14,6 +14,11 @@ public protocol ExpressibleByArgument { /// Creates a new instance of this type from a command-line-specified /// argument. init?(argument: String) + + /// Default representation value in help. + /// + /// Implement this method to customize default value representation in help. + var defaultValueDescription: String { get } } extension String: ExpressibleByArgument { @@ -68,7 +73,7 @@ extension Bool: ExpressibleByArgument {} extension ExpressibleByArgument { - var defaultValueDescription: String { + public var defaultValueDescription: String { let mirror = Mirror(reflecting: self) diff --git a/Tests/ArgumentParserUnitTests/HelpGenerationTests.swift b/Tests/ArgumentParserUnitTests/HelpGenerationTests.swift index b0ca288a6..c9d2acb04 100644 --- a/Tests/ArgumentParserUnitTests/HelpGenerationTests.swift +++ b/Tests/ArgumentParserUnitTests/HelpGenerationTests.swift @@ -16,6 +16,21 @@ import ArgumentParserTestHelpers final class HelpGenerationTests: XCTestCase { } +extension URL: ExpressibleByArgument { + public init?(argument: String) { + guard let url = URL(string: argument) else { + return nil + } + self = url + } + + public var defaultValueDescription: String { + self.absoluteString == FileManager.default.currentDirectoryPath + ? "current directory" + : String(describing: self) + } +} + // MARK: - extension HelpGenerationTests { @@ -117,6 +132,7 @@ extension HelpGenerationTests { } } + struct D: ParsableCommand { @Argument(default: "--", help: "Your occupation.") var occupation: String @@ -138,11 +154,14 @@ extension HelpGenerationTests { @Option(default: .bachelor, help: "Your degree.", transform: Degree.degreeTransform) var degree: Degree + + @Option(default: URL(string: FileManager.default.currentDirectoryPath)!, help: "Directory.") + var directory: URL } func testHelpWithDefaultValues() { AssertHelp(for: D.self, equals: """ - USAGE: d [] [--name ] [--middle-name ] [--age ] [--logging ] [--optional] [--required] [--degree ] + USAGE: d [] [--name ] [--middle-name ] [--age ] [--logging ] [--optional] [--required] [--degree ] [--directory ] ARGUMENTS: Your occupation. (default: --) @@ -155,6 +174,7 @@ extension HelpGenerationTests { --logging Whether logging is enabled. (default: false) --optional/--required Vegan diet. (default: optional) --degree Your degree. (default: bachelor) + --directory Directory. (default: current directory) -h, --help Show help information. """)