Files
swift-argument-parser/Sources/ArgumentParser/Usage/HelpCommand.swift
T
Rauhul Varma 00a86771ca Clean up help generation (#385)
- Adds check to ensure that `wrapped(to:wrappingIndent:)` doesn't
  attempt to retrieve a negative prefix.
- The Usage struct was composed of an array of strings which always
  contained exact one string at runtime. This struct has been removed
  and replaced with a single usage string.
- Removes HelpGenerator._screenWidthOverride in favor of explicitly
  setting the screen width in generateHelp calls.
2022-01-10 16:02:50 -06:00

59 lines
1.9 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: .hidden)
var help = false
private(set) var commandStack: [ParsableCommand.Type] = []
init() {}
mutating func run() throws {
throw CommandError(commandStack: commandStack, parserError: .helpRequested)
}
mutating func buildCommandStack(with parser: CommandParser) throws {
commandStack = parser.commandStack(for: subcommands)
}
/// Used for testing.
func generateHelp(screenWidth: Int) -> String {
HelpGenerator(commandStack: commandStack).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]) {
self.commandStack = commandStack
self.subcommands = commandStack.map { $0._commandName }
self.help = false
}
}