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
JavaScript
;
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 = {}));