UNPKG

tiny-types

Version:

A tiny library that brings Tiny Types to JavaScript and TypeScript

55 lines 2.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.or = or; const isArray_1 = require("./isArray"); const isDefined_1 = require("./isDefined"); const isGreaterThan_1 = require("./isGreaterThan"); const Predicate_1 = require("./Predicate"); /** * @desc Ensures that the `value` meets at least one of the provided {@link Predicate}s. * * @example * import { ensure, isEqualTo, isGreaterThan, isLessThan, or } from 'tiny-type'l * * class Percentage extends TinyType { * constructor(public readonly value: number) { * ensure('Percentage', value, or(isEqualTo(0), isGreaterThan(0)), or(isLessThan(100), isEqualTo(100)); * } * } * * @param {Predicate<T>} predicates * @returns {Predicate<T>} */ function or(...predicates) { return new Or(predicates); } /** @access private */ class Or extends Predicate_1.Predicate { predicates; constructor(predicates) { super(); this.predicates = predicates; const results = [ _ => (0, isDefined_1.isDefined)().check(_), _ => (0, isArray_1.isArray)().check(_), _ => (0, isGreaterThan_1.isGreaterThan)(0).check(_.length), ]; if (results.some(check => check(this.predicates) instanceof Predicate_1.Failure)) { throw new Error(`Looks like you haven't specified any predicates to check the value against?`); } } /** @override */ check(value) { const results = this.predicates.map(predicate => predicate.check(value)); const anySuccess = results.some(result => result instanceof Predicate_1.Success); const failures = results.filter(_ => _ instanceof Predicate_1.Failure) .map((_) => _.description); return anySuccess ? new Predicate_1.Success(value) : new Predicate_1.Failure(value, describe(failures)); } } function describe(issues) { return `either ${issues.join(', ').replace(/,([^,]*)$/, ' or$1')}`; } //# sourceMappingURL=or.js.map