1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
//===----------------------------------------------------------*- 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
}
}
|