in Sources/ArgumentParser/Parsing/SplitArguments.swift [529:578]
func parseIndividualArg(_ arg: String, at position: Int) throws -> [SplitArguments.Element] {
let index = SplitArguments.Index(inputIndex: .init(rawValue: position))
if let nonDashIdx = arg.firstIndex(where: { $0 != "-" }) {
let dashCount = arg.distance(from: arg.startIndex, to: nonDashIdx)
let remainder = arg[nonDashIdx..<arg.endIndex]
switch dashCount {
case 0:
return [.value(arg, index: index)]
case 1:
// Long option:
let parsed = try ParsedArgument(longArgWithSingleDashRemainder: remainder)
// Short options:
let parts = parsed.subarguments
switch parts.count {
case 0:
// This is a '-name=value' style argument
return [.option(parsed, index: index)]
case 1:
// This is a single short '-n' style argument
return [.option(.name(.short(remainder.first!)), index: index)]
default:
var result: [SplitArguments.Element] = [.option(parsed, index: index)]
for (sub, a) in parts {
var i = index
i.subIndex = .sub(sub)
result.append(.option(a, index: i))
}
return result
}
case 2:
return [.option(ParsedArgument(arg), index: index)]
default:
throw ParserError.invalidOption(arg)
}
} else {
// All dashes
let dashCount = arg.count
switch dashCount {
case 0, 1:
// Empty string or single dash
return [.value(arg, index: index)]
case 2:
// We found the 1st "--". All the remaining are positional.
return [.terminator(index: index)]
default:
throw ParserError.invalidOption(arg)
}
}
}