import { uniq } from '@typed/list' import { equals } from '@typed/logic' import { fromJust, isNothing, Just } from '@typed/maybe' import { createParser } from './createParser' import { getPositionalArgumentValue } from './getPositionalArgumentValue' import { isArgumentFlag } from './isArgumentFlag' import { ArgParser, ArgParserResult, ParseOptions } from './types' const isTrue = equals('true') export function parseBooleanArg( name: A, options: ParseOptions = {}, ): ArgParser { return createParser(name, options, (index: number, args: readonly string[]) => { const [valueIndex, value] = parseBooleanArgByPosition(index, args) const indexesUsed = uniq([index, valueIndex]) const result: ArgParserResult = [ indexesUsed, Just.of({ [name]: value } as { [K in A]: boolean }), ] return result }) } function parseBooleanArgByPosition( index: number, args: readonly string[], ): readonly [number, boolean] { const positionalArg = getPositionalArgumentValue(index, args) if (isNothing(positionalArg)) { return [index, true] } const [valueIndex, arg] = fromJust(positionalArg) if (isArgumentFlag(arg)) { return [index, true] } return [valueIndex, isTrue(arg)] }