node-jet
Version:
Jet Realtime Message Bus for the Web. Daemon and Peer implementation.
43 lines (42 loc) • 1.47 kB
JavaScript
import { InvalidArgument } from '../errors.js';
import { getValue } from '../utils.js';
const generators = {
equals: (field, other) => (x) => getValue(x, field) === other,
lessThan: (field, other) => (x) => getValue(x, field) < other,
equalsNot: (field, other) => (x) => getValue(x, field) !== other,
greaterThan: (field, other) => (x) => getValue(x, field) > other,
isType: (field, other) => (x) => typeof getValue(x, field) === other
};
const generatePredicate = (field, rule) => {
const gen = generators[rule.operator];
if (!gen) {
throw new InvalidArgument('unknown rule ' + rule.operator);
}
if (rule.value === null) {
throw new InvalidArgument('unknown value cant be nullish');
}
return gen(field, rule.value);
};
const createValuePredicates = (valueOptions) => {
const predicates = [];
Object.entries(valueOptions).forEach(([field, rule]) => {
predicates.push(generatePredicate(field, rule));
});
return predicates;
};
export const create = (options) => {
if (options.value) {
const predicates = createValuePredicates(options.value);
return (value) => {
if (value === undefined)
return false;
for (let i = 0; i < predicates.length; ++i) {
if (!predicates[i](value)) {
return false;
}
}
return true;
};
}
return () => true;
};