diff --git a/Sources/ArgumentParser/Parsable Properties/Flag.swift b/Sources/ArgumentParser/Parsable Properties/Flag.swift index 7fdc734c6..04f42689a 100644 --- a/Sources/ArgumentParser/Parsable Properties/Flag.swift +++ b/Sources/ArgumentParser/Parsable Properties/Flag.swift @@ -144,6 +144,17 @@ extension Flag where Value == Optional { } } +extension Flag where Value == Optional { + public init( + name: NameSpecification = .long, + help: ArgumentHelp? = nil + ) { + self.init(_parsedValue: .init { key in + .flag(key: key, name: name, help: help, value: ()) + }) + } +} + extension Flag where Value == Bool { /// Creates a Boolean property that reads its value from the presence of a /// flag. diff --git a/Sources/ArgumentParser/Parsing/ArgumentSet.swift b/Sources/ArgumentParser/Parsing/ArgumentSet.swift index 190c440e2..1d3d68eb4 100644 --- a/Sources/ArgumentParser/Parsing/ArgumentSet.swift +++ b/Sources/ArgumentParser/Parsing/ArgumentSet.swift @@ -104,6 +104,14 @@ extension ArgumentSet { return ArgumentSet(arg) } + static func flag(key: InputKey, name: NameSpecification, help: ArgumentHelp?, value: Void) -> ArgumentSet { + let help = ArgumentDefinition.Help(options: .isOptional, help: help, key: key) + let arg = ArgumentDefinition(kind: .name(key: key, specification: name), help: help, update: .nullary({ (origin, name, values) in + values.set(value, forKey: key, inputOrigin: origin) + })) + return ArgumentSet(arg) + } + static func updateFlag(key: InputKey, value: Value, origin: InputOrigin, values: inout ParsedValues, hasUpdated: Bool, exclusivity: FlagExclusivity) throws -> Bool { switch (hasUpdated, exclusivity) { case (true, .exclusive): diff --git a/Tests/ArgumentParserEndToEndTests/FlagsEndToEndTests.swift b/Tests/ArgumentParserEndToEndTests/FlagsEndToEndTests.swift index ddb9dbffd..b8df17f05 100644 --- a/Tests/ArgumentParserEndToEndTests/FlagsEndToEndTests.swift +++ b/Tests/ArgumentParserEndToEndTests/FlagsEndToEndTests.swift @@ -330,3 +330,23 @@ extension FlagsEndToEndTests { } } } + + +fileprivate struct VoidFlag: ParsableArguments { + @Flag() + var test: Void? +} + +extension FlagsEndToEndTests { + func testParsingVoid_DefaultNil() throws { + AssertParse(VoidFlag.self, []) { options in + XCTAssert(options.test == nil) + } + } + + func testParsingVoid_OverrideDefault() throws { + AssertParse(VoidFlag.self, ["--test"]) { options in + XCTAssert(options.test != nil) + } + } +}