MCPcopy
hub / github.com/Effect-TS/effect / parseCommandLine

Function parseCommandLine

packages/cli/src/internal/options.ts:1723–1979  ·  view source on GitHub ↗
(
  self: ParseableInstruction,
  args: ReadonlyArray<string>,
  config: CliConfig.CliConfig
)

Source from the content-addressed store, hash-verified

1721 * - Any leftover command-line arguments
1722 */
1723const 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

Callers 2

wizardInternalFunction · 0.70
findOptionsFunction · 0.70

Calls 9

processArgsFunction · 0.85
normalizeFunction · 0.70
getNamesFunction · 0.70
loopFunction · 0.70
pipeMethod · 0.65
failMethod · 0.65
mapMethod · 0.65
containsMethod · 0.65
ofMethod · 0.65

Tested by

no test coverage detected