| 1721 | * - Any leftover command-line arguments |
| 1722 | */ |
| 1723 | const parseCommandLine = ( |
| 1724 | self: ParseableInstruction, |
| 1725 | args: ReadonlyArray<string>, |
| 1726 | config: CliConfig.CliConfig |
| 1727 | ): Effect.Effect<ParsedCommandLine, ValidationError.ValidationError> => { |
| 1728 | switch (self._tag) { |
| 1729 | case "Single": { |
| 1730 | return processArgs(args).pipe(Effect.flatMap((args) => |
| 1731 | Arr.matchLeft(args, { |
| 1732 | onEmpty: () => { |
| 1733 | const error = InternalHelpDoc.p(`Expected to find option: '${self.fullName}'`) |
| 1734 | return Effect.fail(InternalValidationError.missingFlag(error)) |
| 1735 | }, |
| 1736 | onNonEmpty: (head, tail) => { |
| 1737 | const normalize = (value: string) => InternalCliConfig.normalizeCase(config, value) |
| 1738 | const normalizedHead = normalize(head) |
| 1739 | const normalizedNames = Arr.map(getNames(self), (name) => normalize(name)) |
| 1740 | |
| 1741 | if (Arr.contains(normalizedNames, normalizedHead)) { |
| 1742 | if (InternalPrimitive.isBool(self.primitiveType)) { |
| 1743 | return Arr.matchLeft(tail, { |
| 1744 | onEmpty: () => { |
| 1745 | const parsed = Option.some({ name: head, values: Arr.empty() }) |
| 1746 | return Effect.succeed({ parsed, leftover: tail }) |
| 1747 | }, |
| 1748 | onNonEmpty: (value, leftover) => { |
| 1749 | if (InternalPrimitive.isTrueValue(value)) { |
| 1750 | const parsed = Option.some({ name: head, values: Arr.of("true") }) |
| 1751 | return Effect.succeed<ParsedCommandLine>({ parsed, leftover }) |
| 1752 | } |
| 1753 | if (InternalPrimitive.isFalseValue(value)) { |
| 1754 | const parsed = Option.some({ name: head, values: Arr.of("false") }) |
| 1755 | return Effect.succeed<ParsedCommandLine>({ parsed, leftover }) |
| 1756 | } |
| 1757 | const parsed = Option.some({ name: head, values: Arr.empty() }) |
| 1758 | return Effect.succeed<ParsedCommandLine>({ parsed, leftover: tail }) |
| 1759 | } |
| 1760 | }) |
| 1761 | } |
| 1762 | return Arr.matchLeft(tail, { |
| 1763 | onEmpty: () => { |
| 1764 | const error = InternalHelpDoc.p( |
| 1765 | `Expected a value following option: '${self.fullName}'` |
| 1766 | ) |
| 1767 | return Effect.fail(InternalValidationError.missingValue(error)) |
| 1768 | }, |
| 1769 | onNonEmpty: (value, leftover) => { |
| 1770 | const parsed = Option.some({ name: head, values: Arr.of(value) }) |
| 1771 | return Effect.succeed<ParsedCommandLine>({ parsed, leftover }) |
| 1772 | } |
| 1773 | }) |
| 1774 | } |
| 1775 | |
| 1776 | if (head.startsWith("-")) { |
| 1777 | if ( |
| 1778 | self.name.length > config.autoCorrectLimit + 1 && |
| 1779 | InternalAutoCorrect.levensteinDistance(head, self.fullName, config) <= |
| 1780 | config.autoCorrectLimit |