From f84d612dff971aa6a73474cdfef4d6c7b4c6107b Mon Sep 17 00:00:00 2001 From: Andrew Roan Date: Fri, 18 Apr 2025 16:42:39 -0500 Subject: [PATCH] Add initializer to Positional for ArgumentGroup conforming types feature/init-positional-with-argument-rep --- .../ArgumentEncoding/PositionalArgument.swift | 27 +++++++++++++++++++ .../PositionalTests.swift | 9 +++++++ 2 files changed, 36 insertions(+) diff --git a/Sources/ArgumentEncoding/PositionalArgument.swift b/Sources/ArgumentEncoding/PositionalArgument.swift index da6e91f..9e8bd1b 100644 --- a/Sources/ArgumentEncoding/PositionalArgument.swift +++ b/Sources/ArgumentEncoding/PositionalArgument.swift @@ -224,6 +224,33 @@ extension Positional { } } +// MARK: Convenience initializers when Value: ArgumentGroup + +extension Positional where Value: ArgumentGroup { + /// Initializes a new positional when not used as a `@propertyWrapper` + /// + /// - Parameters + /// - wrappedValue: The underlying value + public init(value: Value) { + wrappedValue = value + unwrap = Self.unwrap(_:) + } + + /// Initializes a new positional when used as a `@propertyWrapper` + /// + /// - Parameters + /// - wrappedValue: The underlying value + public init(wrappedValue: Value) { + self.wrappedValue = wrappedValue + unwrap = Self.unwrap(_:) + } + + @Sendable + public static func unwrap(_ value: Value) -> [String] { + value.arguments() + } +} + // MARK: ExpressibleBy...Literal conformances extension Positional: ExpressibleByIntegerLiteral where Value: BinaryInteger, Value.IntegerLiteralType == Int { diff --git a/Tests/ArgumentEncodingTests/PositionalTests.swift b/Tests/ArgumentEncodingTests/PositionalTests.swift index 3ccd60d..577421f 100644 --- a/Tests/ArgumentEncodingTests/PositionalTests.swift +++ b/Tests/ArgumentEncodingTests/PositionalTests.swift @@ -26,6 +26,15 @@ final class PositionalTests: XCTestCase { let args = container.arguments() XCTAssertEqual(args, ["positional-argument"]) } + + func testPositionalArgumentGroup() throws { + let positional = + Positional( + value: Container(configuration: RawValueCustomStringConvertible(rawValue: "positional-argument")) + ) + let args = positional.arguments() + XCTAssertEqual(args, ["positional-argument"]) + } } private struct RawValueCustomStringConvertible: RawRepresentable, CustomStringConvertible {