From 6e1b78408b119e1b2a1d7c7cc408e0623eb9bf33 Mon Sep 17 00:00:00 2001 From: Guillaume Lessard Date: Thu, 5 Mar 2020 16:40:28 -0700 Subject: [PATCH] make FlagExclusivity.chooseFirst work --- .../ArgumentParser/Parsing/ArgumentSet.swift | 6 ++-- Tests/EndToEndTests/FlagsEndToEndTests.swift | 29 ++++++++++++++++--- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Sources/ArgumentParser/Parsing/ArgumentSet.swift b/Sources/ArgumentParser/Parsing/ArgumentSet.swift index 976f8223d..06edd0526 100644 --- a/Sources/ArgumentParser/Parsing/ArgumentSet.swift +++ b/Sources/ArgumentParser/Parsing/ArgumentSet.swift @@ -176,12 +176,14 @@ extension ArgumentSet { case(true, let previous?, .exclusive): // This value has already been set. throw ParserError.duplicateExclusiveValues(previous: previous.inputOrigin, duplicate: origin, originalInput: values.originalInput) + case (true, _, .chooseFirst): + values.update(forKey: key, inputOrigin: origin, initial: value, closure: { _ in }) case (false, _, _), (_, _, .chooseLast): values.set(value, forKey: key, inputOrigin: origin) - return true default: - return hasUpdated + break } + return true } /// Creates an argument set for a pair of inverted Boolean flags. diff --git a/Tests/EndToEndTests/FlagsEndToEndTests.swift b/Tests/EndToEndTests/FlagsEndToEndTests.swift index 86cb9bf84..198f95fe2 100644 --- a/Tests/EndToEndTests/FlagsEndToEndTests.swift +++ b/Tests/EndToEndTests/FlagsEndToEndTests.swift @@ -80,10 +80,9 @@ extension FlagsEndToEndTests { AssertParse(Bar.self, ["--enable-logging"]) { options in XCTAssertEqual(options.logging, true) } -// Can't test this yet, because .chooseFirst flags don't work -// AssertParse(Bar.self, ["--enable-logging", "--disable-logging"]) { options in -// XCTAssertEqual(options.logging, false) -// } + AssertParse(Bar.self, ["--disable-logging", "--enable-logging"]) { options in + XCTAssertEqual(options.logging, false) + } } } @@ -263,3 +262,25 @@ extension FlagsEndToEndTests { XCTAssertThrowsError(try Qux.parse(["--pink", "--small", "--bloop"])) } } + +fileprivate struct RepeatOK: ParsableArguments { + @Flag(exclusivity: .chooseFirst) + var color: Color + + @Flag(exclusivity: .chooseLast) + var shape: Shape +} + +extension FlagsEndToEndTests { + func testParsingCaseIterable_RepeatableFlags() throws { + AssertParse(RepeatOK.self, ["--pink", "--purple", "--square"]) { options in + XCTAssertEqual(options.color, .pink) + XCTAssertEqual(options.shape, .square) + } + + AssertParse(RepeatOK.self, ["--round", "--oblong", "--silver"]) { options in + XCTAssertEqual(options.color, .silver) + XCTAssertEqual(options.shape, .oblong) + } + } +}