Skip to content

Commit c959b3a

Browse files
authored
Hide optional flags when a command has too many options (#416)
The usage string feature that only shows positional args and required options/flags was incorrectly allowing through flags with type `Bool?`.
1 parent b3a9c24 commit c959b3a

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

Sources/ArgumentParser/Parsable Properties/Flag.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,14 @@ extension Flag where Value == Optional<Bool> {
209209
help: ArgumentHelp? = nil
210210
) {
211211
self.init(_parsedValue: .init { key in
212-
.flag(key: key, name: name, default: nil, inversion: inversion, exclusivity: exclusivity, help: help)
212+
.flag(
213+
key: key,
214+
name: name,
215+
default: nil,
216+
required: false,
217+
inversion: inversion,
218+
exclusivity: exclusivity,
219+
help: help)
213220
})
214221
}
215222
}
@@ -257,7 +264,14 @@ extension Flag where Value == Bool {
257264
help: ArgumentHelp?
258265
) {
259266
self.init(_parsedValue: .init { key in
260-
.flag(key: key, name: name, default: initial, inversion: inversion, exclusivity: exclusivity, help: help)
267+
.flag(
268+
key: key,
269+
name: name,
270+
default: initial,
271+
required: initial == nil,
272+
inversion: inversion,
273+
exclusivity: exclusivity,
274+
help: help)
261275
})
262276
}
263277

Sources/ArgumentParser/Parsing/ArgumentSet.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,16 @@ extension ArgumentSet {
106106
}
107107

108108
/// Creates an argument set for a pair of inverted Boolean flags.
109-
static func flag(key: InputKey, name: NameSpecification, default initialValue: Bool?, inversion: FlagInversion, exclusivity: FlagExclusivity, help: ArgumentHelp?) -> ArgumentSet {
110-
// The flag is required if initialValue is `nil`, otherwise it's optional
111-
let helpOptions: ArgumentDefinition.Help.Options = initialValue != nil ? .isOptional : []
109+
static func flag(
110+
key: InputKey,
111+
name: NameSpecification,
112+
default initialValue: Bool?,
113+
required: Bool,
114+
inversion: FlagInversion,
115+
exclusivity: FlagExclusivity,
116+
help: ArgumentHelp?) -> ArgumentSet
117+
{
118+
let helpOptions: ArgumentDefinition.Help.Options = required ? [] : .isOptional
112119

113120
let enableHelp = ArgumentDefinition.Help(options: helpOptions, help: help, defaultValue: initialValue.map(String.init), key: key, isComposite: true)
114121
let disableHelp = ArgumentDefinition.Help(options: [.isOptional], help: help, key: key)

Tests/ArgumentParserUnitTests/UsageGenerationTests.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ extension UsageGenerationTests {
175175
}
176176

177177
struct M: ParsableArguments {
178+
enum Color: String, EnumerableFlag {
179+
case green, blue, yellow
180+
}
181+
178182
@Flag var a: Bool = false
179183
@Flag var b: Bool = false
180184
@Flag var c: Bool = false
@@ -187,6 +191,12 @@ extension UsageGenerationTests {
187191
@Flag var j: Bool = false
188192
@Flag var k: Bool = false
189193
@Flag var l: Bool = false
194+
195+
@Flag(inversion: .prefixedEnableDisable)
196+
var optionalBool: Bool?
197+
198+
@Flag var optionalColor: Color?
199+
190200
@Option var option: Bool
191201
@Argument var input: String
192202
@Argument var output: String?

0 commit comments

Comments
 (0)