From 06a3ad5fef63cc30fbbb52dcac3e1bb6b7da9ccf Mon Sep 17 00:00:00 2001 From: Hrishikesh Parmar Date: Wed, 26 Aug 2026 15:05:47 +0530 Subject: [PATCH] Fix parsing of empty long option values --- .../Parsing/SplitArguments.swift | 2 +- .../SimpleEndToEndTests.swift | 18 ++++++++++++++++++ .../SplitArgumentTests.swift | 13 +++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Sources/ArgumentParser/Parsing/SplitArguments.swift b/Sources/ArgumentParser/Parsing/SplitArguments.swift index d484668b9..b56d11b46 100644 --- a/Sources/ArgumentParser/Parsing/SplitArguments.swift +++ b/Sources/ArgumentParser/Parsing/SplitArguments.swift @@ -25,7 +25,7 @@ enum ParsedArgument: Equatable, CustomStringConvertible { ) let name = Name(baseName) self = - value.isEmpty + indexOfEqualSign == str.endIndex ? .name(name) : .nameWithValue(name, String(value)) } diff --git a/Tests/ArgumentParserEndToEndTests/SimpleEndToEndTests.swift b/Tests/ArgumentParserEndToEndTests/SimpleEndToEndTests.swift index 508c8bb91..09bf38b5a 100644 --- a/Tests/ArgumentParserEndToEndTests/SimpleEndToEndTests.swift +++ b/Tests/ArgumentParserEndToEndTests/SimpleEndToEndTests.swift @@ -49,6 +49,24 @@ extension SimpleEndToEndTests { } } +// MARK: Empty option value + +private struct Qux: ParsableArguments { + @Option() var output: String + @Argument() var file: String +} + +// swift-format-ignore: AlwaysUseLowerCamelCase +// https://github.com/apple/swift-argument-parser/issues/710 +extension SimpleEndToEndTests { + func testParsing_EmptyOptionValue() throws { + AssertParse(Qux.self, ["--output=", "file.txt"]) { qux in + XCTAssertEqual(qux.output, "") + XCTAssertEqual(qux.file, "file.txt") + } + } +} + // MARK: Single value Int private struct Foo: ParsableArguments { diff --git a/Tests/ArgumentParserUnitTests/SplitArgumentTests.swift b/Tests/ArgumentParserUnitTests/SplitArgumentTests.swift index 7af2baba1..a329a2601 100644 --- a/Tests/ArgumentParserUnitTests/SplitArgumentTests.swift +++ b/Tests/ArgumentParserUnitTests/SplitArgumentTests.swift @@ -119,6 +119,19 @@ private func expectElementEqual( #expect(sut.originalInput == ["--abc=def"]) } + @Test func singleLongOptionWithEmptyValue() async throws { + let sut = try SplitArguments(arguments: ["--abc="]) + + #expect(sut.elements.count == 1) + try expectIndexEqual(sut, at: 0, inputIndex: 0, subIndex: .complete) + try expectElementEqual( + sut, at: 0, .option(.nameWithValue(.long("abc"), "")) + ) + + #expect(sut.originalInput.count == 1) + #expect(sut.originalInput == ["--abc="]) + } + @Test func multipleShortOptionsCombined() async throws { let sut = try SplitArguments(arguments: ["-abc"])