Skip to content

Commit 7f5984a

Browse files
authored
make FlagExclusivity.chooseFirst work (#67)
1 parent 3af071f commit 7f5984a

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

Sources/ArgumentParser/Parsing/ArgumentSet.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,14 @@ extension ArgumentSet {
176176
case(true, let previous?, .exclusive):
177177
// This value has already been set.
178178
throw ParserError.duplicateExclusiveValues(previous: previous.inputOrigin, duplicate: origin, originalInput: values.originalInput)
179+
case (true, _, .chooseFirst):
180+
values.update(forKey: key, inputOrigin: origin, initial: value, closure: { _ in })
179181
case (false, _, _), (_, _, .chooseLast):
180182
values.set(value, forKey: key, inputOrigin: origin)
181-
return true
182183
default:
183-
return hasUpdated
184+
break
184185
}
186+
return true
185187
}
186188

187189
/// Creates an argument set for a pair of inverted Boolean flags.

Tests/EndToEndTests/FlagsEndToEndTests.swift

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,9 @@ extension FlagsEndToEndTests {
8080
AssertParse(Bar.self, ["--enable-logging"]) { options in
8181
XCTAssertEqual(options.logging, true)
8282
}
83-
// Can't test this yet, because .chooseFirst flags don't work
84-
// AssertParse(Bar.self, ["--enable-logging", "--disable-logging"]) { options in
85-
// XCTAssertEqual(options.logging, false)
86-
// }
83+
AssertParse(Bar.self, ["--disable-logging", "--enable-logging"]) { options in
84+
XCTAssertEqual(options.logging, false)
85+
}
8786
}
8887
}
8988

@@ -263,3 +262,25 @@ extension FlagsEndToEndTests {
263262
XCTAssertThrowsError(try Qux.parse(["--pink", "--small", "--bloop"]))
264263
}
265264
}
265+
266+
fileprivate struct RepeatOK: ParsableArguments {
267+
@Flag(exclusivity: .chooseFirst)
268+
var color: Color
269+
270+
@Flag(exclusivity: .chooseLast)
271+
var shape: Shape
272+
}
273+
274+
extension FlagsEndToEndTests {
275+
func testParsingCaseIterable_RepeatableFlags() throws {
276+
AssertParse(RepeatOK.self, ["--pink", "--purple", "--square"]) { options in
277+
XCTAssertEqual(options.color, .pink)
278+
XCTAssertEqual(options.shape, .square)
279+
}
280+
281+
AssertParse(RepeatOK.self, ["--round", "--oblong", "--silver"]) { options in
282+
XCTAssertEqual(options.color, .silver)
283+
XCTAssertEqual(options.shape, .oblong)
284+
}
285+
}
286+
}

0 commit comments

Comments
 (0)