UNPKG

decline-ts

Version:

Composable command-line parser for TypeScript - a (partial) porting of Scala decline using fp-ts

115 lines (114 loc) 5.05 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Accumulator = exports.AccumulatorMatch = exports.AccumulatorArgOut = void 0; const fp_ts_1 = require("fp-ts"); const function_1 = require("fp-ts/function"); const Parser_1 = require("../Parser"); const Result_1 = require("../Result"); const ArgOut_1 = require("./ArgOut"); const Match_1 = require("./Match"); const Ap = __importStar(require("./types/Ap")); const Argument = __importStar(require("./types/Argument")); const Arguments = __importStar(require("./types/Arguments")); const Flag = __importStar(require("./types/Flag")); const OrElse = __importStar(require("./types/OrElse")); const Pure = __importStar(require("./types/Pure")); const Regular = __importStar(require("./types/Regular")); const Subcommand = __importStar(require("./types/Subcommand")); const Validate = __importStar(require("./types/Validate")); exports.AccumulatorArgOut = ArgOut_1.ArgOut; exports.AccumulatorMatch = Match_1.Match; var Accumulator; (function (Accumulator) { /** * Constructors */ Accumulator.orElse = OrElse.of; Accumulator.fromOpts = (opts) => { switch (opts._tag) { case 'Pure': return Pure.of(Result_1.Result.success(opts.a)); case 'App': return Ap.of(Accumulator.fromOpts(opts.f), Accumulator.fromOpts(opts.a)); case 'OrElse': return OrElse.of(Accumulator.fromOpts(opts.a), Accumulator.fromOpts(opts.b)); case 'Single': return fromSingle(opts.opt); case 'Repeated': return fromRepeated(opts.opt); case 'Subcommand': return Subcommand.of(opts.command.name, Parser_1.Parser(opts.command)); case 'Validate': return function_1.pipe(Accumulator.fromOpts(opts.value), Accumulator.mapValidated(opts.validate)); case 'HelpFlag': return function_1.pipe(Accumulator.fromOpts(opts.flag), Accumulator.mapValidated(() => fp_ts_1.either.left(fp_ts_1.readonlyArray.empty))); } }; const fromSingle = (opt) => { switch (opt._tag) { case 'Regular': return function_1.pipe(Regular.of(opt.names), // TODO: cast bad. Accumulator.map(fp_ts_1.readonlyNonEmptyArray.last)); case 'Flag': return function_1.pipe(Flag.of(opt.names), // TODO: cast bad. Accumulator.map(fp_ts_1.readonlyNonEmptyArray.last)); case 'Argument': return Argument.of; } }; const fromRepeated = (opt) => { switch (opt._tag) { case 'Regular': return Regular.of(opt.names); case 'Flag': return Flag.of(opt.names); case 'Argument': return Arguments.of([]); } }; Accumulator.instances = { [Pure.URI]: Pure.pure, [Ap.URI]: Ap.ap, [OrElse.URI]: OrElse.orElse, [Regular.URI]: Regular.regular, [Flag.URI]: Flag.flag, [Argument.URI]: Argument.argument, [Arguments.URI]: Arguments.arguments_, [Subcommand.URI]: Subcommand.subcommand, [Validate.URI]: Validate.validate, }; /** * Methods */ Accumulator.parseOption = (name) => (fa) => function_1.pipe(fa, withMethod(fa._tag, 'parseOption')(name)); Accumulator.parseArg = (arg) => (fa) => { const method = withMethod(fa._tag, 'parseArg'); return method === undefined ? fp_ts_1.readonlyNonEmptyArray.of(fp_ts_1.either.left(fa)) : function_1.pipe(fa, method(arg)); }; Accumulator.parseSub = (command) => (fa) => function_1.pipe(fa, withMethod(fa._tag, 'parseSub')(command)); Accumulator.result = (fa) => function_1.pipe(fa, withMethod(fa._tag, 'result')); Accumulator.mapValidated = (f) => (fa) => Validate.of(fa, f); Accumulator.map = (f) => Accumulator.mapValidated(function_1.flow(f, fp_ts_1.either.right)); })(Accumulator = exports.Accumulator || (exports.Accumulator = {})); const withMethod = (uri, method) => Accumulator.instances[uri][method];