diff --git a/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift b/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift index 0f09b90a..b0aeb07e 100644 --- a/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift +++ b/Sources/ArgumentParser/Parsable Types/ExpressibleByArgument.swift @@ -122,6 +122,17 @@ extension LosslessStringConvertible where Self: ExpressibleByArgument { } } +extension LosslessStringConvertible +where + Self: ExpressibleByArgument & RawRepresentable, + RawValue: ExpressibleByArgument +{ + // Ambiguity breaker + public init?(argument: String) { + self.init(argument) + } +} + extension Int: ExpressibleByArgument {} extension Int8: ExpressibleByArgument {} extension Int16: ExpressibleByArgument {} diff --git a/Tests/ArgumentParserEndToEndTests/RawRepresentableEndToEndTests.swift b/Tests/ArgumentParserEndToEndTests/RawRepresentableEndToEndTests.swift index a4f40b56..62114659 100644 --- a/Tests/ArgumentParserEndToEndTests/RawRepresentableEndToEndTests.swift +++ b/Tests/ArgumentParserEndToEndTests/RawRepresentableEndToEndTests.swift @@ -48,3 +48,16 @@ extension RawRepresentableEndToEndTests { XCTAssertThrowsError(try Bar.parse(["--identifier", "123.456"])) } } + +struct LogLevel: RawRepresentable, CustomStringConvertible { + var rawValue: String + var description: String { rawValue } +} + +extension LogLevel: LosslessStringConvertible { + init(_ description: String) { + self.rawValue = description + } +} + +extension LogLevel: ExpressibleByArgument {}