From c17e00a3bf6bcc0d461912cc339c44fca7bc070d Mon Sep 17 00:00:00 2001 From: Elliott Williams Date: Fri, 18 Sep 2020 09:55:07 -0700 Subject: [PATCH] Store mutations made by validate() (#239) --- .../Parsing/CommandParser.swift | 3 +++ .../ValidationEndToEndTests.swift | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Sources/ArgumentParser/Parsing/CommandParser.swift b/Sources/ArgumentParser/Parsing/CommandParser.swift index 8875772b..f037f5d6 100644 --- a/Sources/ArgumentParser/Parsing/CommandParser.swift +++ b/Sources/ArgumentParser/Parsing/CommandParser.swift @@ -157,6 +157,9 @@ extension CommandParser { // after decoding a command, make sure to validate it do { try parsedCommand.validate() + var lastArgument = decodedArguments.removeLast() + lastArgument.value = parsedCommand + decodedArguments.append(lastArgument) } catch { try checkForBuiltInFlags(split) throw CommandError(commandStack: commandStack, parserError: ParserError.userValidationError(error)) diff --git a/Tests/ArgumentParserEndToEndTests/ValidationEndToEndTests.swift b/Tests/ArgumentParserEndToEndTests/ValidationEndToEndTests.swift index 8228c490..79e2cda2 100644 --- a/Tests/ArgumentParserEndToEndTests/ValidationEndToEndTests.swift +++ b/Tests/ArgumentParserEndToEndTests/ValidationEndToEndTests.swift @@ -146,3 +146,28 @@ extension ValidationEndToEndTests { AssertFullErrorMessage(Foo.self, ["--fail-silently", "Joe"], "") } } + +fileprivate struct FooCommand: ParsableCommand { + @Flag(help: .hidden) + var foo = false + @Flag(help: .hidden) + var bar = false + + mutating func validate() throws { + if foo { + // --foo implies --bar + bar = true + } + } + + func run() throws { + XCTAssertEqual(foo, bar) + } +} + +extension ValidationEndToEndTests { + func testMutationsPreserved() throws { + var foo = try FooCommand.parseAsRoot(["--foo"]) + try foo.run() + } +}