tiny-types
Version:
A tiny library that brings Tiny Types to JavaScript and TypeScript
55 lines • 2.02 kB
JavaScript
;
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