Files
Rauhul Varma e7765e1f39 Replace createHelp and includeHidden (#405)
- Replaces `ArgumentSet.init(_:creatingHelp:includeHidden:)` with
  `ArgumentSet.init(_:visibility:)`. `visibility` intentionally does not
  have a default value to ensure that callers only have the correct
  arguments. As part of this change `includeHidden` has been replaced
  throughout the codebase with `visibility`. This change also fixes a
  bug where arguments with hidden `visibility` were being displayed in the
  generated command usage string.
2022-02-14 23:54:57 -06:00

66 lines
2.1 KiB
Swift

//===----------------------------------------------------------*- swift -*-===//
//
// This source file is part of the Swift Argument Parser open source project
//
// Copyright (c) 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
//
//===----------------------------------------------------------------------===//
struct HelpCommand: ParsableCommand {
static var configuration = CommandConfiguration(
commandName: "help",
abstract: "Show subcommand help information.",
helpNames: [])
/// Any subcommand names provided after the `help` subcommand.
@Argument var subcommands: [String] = []
/// Capture and ignore any extra help flags given by the user.
@Flag(name: [.short, .long, .customLong("help", withSingleDash: true)], help: .private)
var help = false
private(set) var commandStack: [ParsableCommand.Type] = []
private(set) var visibility: ArgumentVisibility = .default
init() {}
mutating func run() throws {
throw CommandError(
commandStack: commandStack,
parserError: .helpRequested(visibility: visibility))
}
mutating func buildCommandStack(with parser: CommandParser) throws {
commandStack = parser.commandStack(for: subcommands)
}
/// Used for testing.
func generateHelp(screenWidth: Int) -> String {
HelpGenerator(
commandStack: commandStack,
visibility: visibility)
.rendered(screenWidth: screenWidth)
}
enum CodingKeys: CodingKey {
case subcommands
case help
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.subcommands = try container.decode([String].self, forKey: .subcommands)
self.help = try container.decode(Bool.self, forKey: .help)
}
init(commandStack: [ParsableCommand.Type], visibility: ArgumentVisibility) {
self.commandStack = commandStack
self.visibility = visibility
self.subcommands = commandStack.map { $0._commandName }
self.help = false
}
}