Skip to content

Commit 0c2af69

Browse files
committed
Fix handling of visibility with nested OptionGroups.
The visibility of OptionGroups is ignored if they are nested inside another OptionGroup. Instead of trying to filter groups when creating an ArgumentSet, use the OptionGroup's visibility to modify the arguments within the group.
1 parent 1fb5308 commit 0c2af69

File tree

4 files changed

+35
-8
lines changed

4 files changed

+35
-8
lines changed

Sources/ArgumentParser/Parsable Properties/ArgumentVisibility.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,26 @@ extension ArgumentVisibility {
5757
internal func isAtLeastAsVisible(as other: Self) -> Bool {
5858
self.base._comparableLevel >= other.base._comparableLevel
5959
}
60+
61+
/// Reduce the visibility to a specified level if it is more restricted than the current value.
62+
internal mutating func reduce(to: ArgumentVisibility) {
63+
switch to.base {
64+
case .default:
65+
break // No effect
66+
case .hidden:
67+
if case .default = self.base {
68+
self.base = .hidden
69+
}
70+
case .private:
71+
self.base = .private
72+
}
73+
}
74+
}
75+
76+
extension ArgumentDefinition {
77+
internal func reducingHelpVisibility(to visibility: ArgumentVisibility) -> Self {
78+
var result = self
79+
result.help.visibility.reduce(to: visibility)
80+
return result
81+
}
6082
}

Sources/ArgumentParser/Parsable Properties/OptionGroup.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ public struct OptionGroup<Value: ParsableArguments>: Decodable, ParsedWrapper {
8888
$0.help.parentTitle = title
8989
}
9090
}
91+
args.content = args.content.map { arg in
92+
arg.reducingHelpVisibility(to: visibility)
93+
}
9194
return args
9295
})
9396
self._visibility = visibility

Sources/ArgumentParser/Parsable Types/ParsableArguments.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,6 @@ extension ArgumentSet {
301301
guard let codingKey = child.label else { return nil }
302302

303303
if let parsed = child.value as? ArgumentSetProvider {
304-
guard parsed._visibility.isAtLeastAsVisible(as: visibility)
305-
else { return nil }
306-
307304
let key = InputKey(name: codingKey, parent: parent)
308305
return parsed.argumentSet(for: key)
309306
} else {

Tests/ArgumentParserUnitTests/HelpGenerationTests+GroupName.swift

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,18 +187,23 @@ extension HelpGenerationTests {
187187
""")
188188
}
189189

190+
fileprivate struct NestedGroups: ParsableArguments {
191+
@OptionGroup(visibility: .hidden)
192+
var flagsAndOptions: FlagsAndOptions
193+
194+
@OptionGroup(visibility: .private)
195+
var argsAndFlags: ArgsAndFlags
196+
}
197+
190198
fileprivate struct HiddenGroups: ParsableCommand {
191199
@OptionGroup(title: "Flags Group", visibility: .hidden)
192200
var flags: Flags
193201

194202
@OptionGroup(title: "Options Group", visibility: .hidden)
195203
var options: Options
196204

197-
@OptionGroup(visibility: .hidden)
198-
var flagsAndOptions: FlagsAndOptions
199-
200-
@OptionGroup(visibility: .private)
201-
var argsAndFlags: ArgsAndFlags
205+
@OptionGroup()
206+
var nested: NestedGroups
202207
}
203208

204209
func testHiddenGroups() {

0 commit comments

Comments
 (0)