UNPKG

decline-ts

Version:

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

82 lines (81 loc) 4.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Result = void 0; const fp_ts_1 = require("fp-ts"); const function_1 = require("fp-ts/function"); const StringUtils_1 = require("./utils/StringUtils"); const URI_ = 'Result'; function Result(get) { return { get }; } exports.Result = Result; (function (Result) { /** * Constructors */ Result.success = (value) => Result(fp_ts_1.either.right(() => fp_ts_1.either.right(value))); Result.failure = (reversedMissing) => Result(fp_ts_1.either.left(Failure(reversedMissing))); Result.fail = Result.failure([]); Result.missingCommand = (command) => Result.failure([Missing({ commands: [command] })]); Result.missingFlag = (flag) => Result(fp_ts_1.either.left(Failure(fp_ts_1.readonlyArray.of(Missing({ flags: fp_ts_1.readonlyArray.of(flag) }))))); Result.missingArgument = Result.failure([Missing({ argument: true })]); /** * Methods */ Result.mapValidated = (f) => (res) => function_1.pipe(res.get, fp_ts_1.either.map(_ => () => function_1.pipe(_(), fp_ts_1.either.chain(f))), Result); Result.map = (f) => Result.mapValidated(function_1.flow(f, fp_ts_1.either.right)); Result.ap = (fab) => (fa) => function_1.pipe(fp_ts_1.apply.sequenceT(failureValidation)(fab.get, fa.get), fp_ts_1.either.map(([fabGet, faGet]) => () => function_1.pipe(fp_ts_1.apply.sequenceT(stringsValidation)(fabGet(), faGet()), fp_ts_1.either.map(([f, a]) => f(a)))), Result); Result.alt = (that) => (fa) => { if (fp_ts_1.either.isRight(fa.get)) return fa; const y = that(); if (fp_ts_1.either.isRight(y.get)) return y; if (fp_ts_1.readonlyArray.isEmpty(y.get.left.reversedMissing)) return fa; if (fp_ts_1.readonlyArray.isEmpty(fa.get.left.reversedMissing)) return y; return function_1.pipe(fp_ts_1.readonlyArray.zip(fa.get.left.reversedMissing, y.get.left.reversedMissing), fp_ts_1.readonlyArray.map(([a, b]) => Missing.semigroup.concat(a, b)), Result.failure); }; /** * Instance */ Result.URI = URI_; Result.result = { URI: Result.URI, map: (fa, f) => function_1.pipe(fa, Result.map(f)), ap: (fab, fa) => function_1.pipe(fa, Result.ap(fab)), alt: (fa, that) => function_1.pipe(fa, Result.alt(that)), }; function Failure(reversedMissing) { return { reversedMissing }; } Result.Failure = Failure; (function (Failure) { Failure.semigroup = { concat: (x, y) => Failure([...y.reversedMissing, ...x.reversedMissing]), }; Failure.messages = (f) => function_1.pipe(f.reversedMissing, fp_ts_1.readonlyArray.reverse, fp_ts_1.readonlyArray.map(Missing.message)); })(Failure = Result.Failure || (Result.Failure = {})); function Missing({ flags = fp_ts_1.readonlyArray.empty, commands = fp_ts_1.readonlyArray.empty, argument = false, } = {}) { return { flags, commands, argument }; } Result.Missing = Missing; (function (Missing) { Missing.semigroup = { concat: (x, y) => Missing({ commands: [...x.commands, ...y.commands], argument: x.argument || y.argument, }), }; Missing.message = (m) => { const commandString = fp_ts_1.readonlyArray.isEmpty(m.commands) ? fp_ts_1.option.none : fp_ts_1.option.some(function_1.pipe(m.commands, fp_ts_1.readonlyArray.uniq(fp_ts_1.eq.eqString), StringUtils_1.StringUtils.mkString('command (', ' or ', ')'))); const argString = m.argument ? fp_ts_1.option.some('positional argument') : fp_ts_1.option.none; return function_1.pipe(fp_ts_1.readonlyArray.compact([commandString, argString]), StringUtils_1.StringUtils.mkString('Missing expected ', ', or ', '')); }; })(Missing = Result.Missing || (Result.Missing = {})); const failureValidation = fp_ts_1.either.getValidation(Failure.semigroup); const stringsValidation = fp_ts_1.either.getValidation(fp_ts_1.readonlyArray.getMonoid()); })(Result = exports.Result || (exports.Result = {}));