Add ability to process short flags (untested)
This commit is contained in:
parent
47859ffa34
commit
9a156fea16
@ -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]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user