in Sources/ArgumentParser/Parsing/CommandParser.swift [201:239]
mutating func parse(arguments: [String]) -> Result<ParsableCommand, CommandError> {
do {
try handleCustomCompletion(arguments)
} catch {
return .failure(CommandError(commandStack: [commandTree.element], parserError: error as! ParserError))
}
var split: SplitArguments
do {
split = try SplitArguments(arguments: arguments)
} catch let error as ParserError {
return .failure(CommandError(commandStack: [commandTree.element], parserError: error))
} catch {
return .failure(CommandError(commandStack: [commandTree.element], parserError: .invalidState))
}
do {
try checkForCompletionScriptRequest(&split)
try descendingParse(&split)
let result = try extractLastParsedValue(split)
// HelpCommand is a valid result, but needs extra information about
// the tree from the parser to build its stack of commands.
if var helpResult = result as? HelpCommand {
try helpResult.buildCommandStack(with: self)
return .success(helpResult)
}
return .success(result)
} catch let error as CommandError {
return .failure(error)
} catch let error as ParserError {
let error = arguments.isEmpty ? ParserError.noArguments(error) : error
return .failure(CommandError(commandStack: commandStack, parserError: error))
} catch is HelpRequested {
return .success(HelpCommand(commandStack: commandStack))
} catch {
return .failure(CommandError(commandStack: commandStack, parserError: .invalidState))
}
}