Add ability to process short flags (untested)

This commit is contained in:
Jerko Steiner 2019-08-05 20:26:39 +07:00
parent 47859ffa34
commit 9a156fea16

View File

@ -10,6 +10,7 @@ export type TArgType<T extends TArgTypeName> =
export interface IArgConfig<T extends TArgTypeName> { export interface IArgConfig<T extends TArgTypeName> {
type: T type: T
alias?: string
default?: TArgType<T> default?: TArgType<T>
required?: boolean required?: boolean
} }
@ -52,19 +53,42 @@ export function argparse<T extends object>(
const it = iterate(args) const it = iterate(args)
const usedArgs: Record<string, true> = {} const usedArgs: Record<string, true> = {}
const aliases: Record<string, string> = {}
const requiredArgs = Object.keys(config).reduce((obj, arg) => { const requiredArgs = Object.keys(config).reduce((obj, arg) => {
const argConfig = config[arg] const argConfig = config[arg]
if (argConfig.default !== undefined) { if (argConfig.default !== undefined) {
result[arg] = argConfig.default result[arg] = argConfig.default
} }
if (argConfig.alias) {
aliases[argConfig.alias] = arg
}
obj[arg] = !!argConfig.required obj[arg] = !!argConfig.required
return obj return obj
}, {} as Record<string, boolean>) }, {} as Record<string, boolean>)
while(it.hasNext()) { while(it.hasNext()) {
const arg = it.next() const arg = it.next()
assert(arg.substring(0, 2) === '--', 'Arguments must start with --') assert(arg.substring(0, 1) === '-', 'Arguments must start with -')
const argName = arg.substring(2) let argName: string
if (arg.substring(1, 2) !== '-') {
// flags
const flags = arg.substring(1).split('')
flags.slice(0, flags.length - 2)
.forEach(flag => {
const alias = aliases[flag]
const argConfig = config[alias]
assert(!!argConfig, 'Unknown flag: ' + flag)
assert(argConfig.type === 'boolean', 'The argument is not a flag/boolean: ' + flag)
delete requiredArgs[alias]
result[alias] = true
})
const lastArg = flags[flags.length - 1]
argName = aliases[lastArg]
} else {
argName = arg.substring(2)
}
const argConfig = config[argName] const argConfig = config[argName]
assert(!!argConfig, 'Unknown argument: ' + arg) assert(!!argConfig, 'Unknown argument: ' + arg)
delete requiredArgs[argName] delete requiredArgs[argName]