Skip to content

Commit 81f39b1

Browse files
committed
fixed issue with flags parsed twice on multiflags.
1 parent 7d55ac9 commit 81f39b1

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

Sources/parsers/MultiFlag.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,14 @@ public class MultiFlag: Parser, ParserNode, ParsePathSegment {
4747
return 1
4848
}
4949
}
50-
return try parseTree(arguments: arguments, atIndex: i, path: path + [self], childParsers: parsers)
50+
// parse flag normally
51+
for parser in parsers {
52+
let tokensConsumed = try parser.parse(arguments: arguments, atIndex: i, path: path + [self])
53+
if tokensConsumed > 0 {
54+
return tokensConsumed
55+
}
56+
}
57+
return 0
5158
}
5259

5360
public var description: [(argument: String, description: String)] {

Tests/argtreeTests/parsers/MultiFlagTests.swift

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ final class MultiFlagTests: XCTestCase {
66
func testFlagParsing() {
77
var xPath: [ParsePathSegment] = []
88
var yPath: [ParsePathSegment] = []
9-
let tokensConsumed = try? ArgTree(parsers: [
9+
let tokensConsumed = try! ArgTree(parsers: [
1010
MultiFlag(parsers: [
1111
Flag(shortName: "x", parsed: { path in
1212
xPath = path
@@ -22,6 +22,21 @@ final class MultiFlagTests: XCTestCase {
2222
XCTAssertEqual(yPath.count, 1, "yPath \(yPath)")
2323
}
2424

25+
func testFlagParsingWithOneFlag() {
26+
var xPath: [ParsePathSegment] = []
27+
let tokensConsumed = try! ArgTree(parsers: [
28+
MultiFlag(parsers: [
29+
Flag(shortName: "x", parsed: { path in
30+
xPath = path
31+
}),
32+
]),
33+
VarArgs(),
34+
]).parse(arguments: ["ignored", "foo", "-x"])
35+
36+
XCTAssertEqual(tokensConsumed, 3)
37+
XCTAssertEqual(xPath.count, 1, "xPath \(xPath)")
38+
}
39+
2540
func testFlagParsingStopToken() {
2641
var xPath: [ParsePathSegment] = []
2742
var yPath: [ParsePathSegment] = []

0 commit comments

Comments
 (0)