feat(complex-matcher): number comparison (#2702)
`foo:>=42` matches `{ foo: 42 }` but not `"bar"` nor `{ foo: 37 }`.
This commit is contained in:
parent
4257cbb618
commit
f060f56c93
@ -70,6 +70,29 @@ export class And extends Node {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class Comparison extends Node {
|
||||||
|
constructor (operator, value) {
|
||||||
|
super()
|
||||||
|
this._comparator = Comparison.comparators[operator]
|
||||||
|
this._operator = operator
|
||||||
|
this._value = value
|
||||||
|
}
|
||||||
|
|
||||||
|
match (value) {
|
||||||
|
return typeof value === 'number' && this._comparator(value, this._value)
|
||||||
|
}
|
||||||
|
|
||||||
|
toString () {
|
||||||
|
return this._operator + String(this._value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Comparison.comparators = {
|
||||||
|
'>': (a, b) => a > b,
|
||||||
|
'>=': (a, b) => a >= b,
|
||||||
|
'<': (a, b) => a < b,
|
||||||
|
'<=': (a, b) => a <= b,
|
||||||
|
}
|
||||||
|
|
||||||
export class Or extends Node {
|
export class Or extends Node {
|
||||||
constructor (children) {
|
constructor (children) {
|
||||||
super()
|
super()
|
||||||
@ -408,6 +431,13 @@ const parser = P.grammar({
|
|||||||
P.text(')')
|
P.text(')')
|
||||||
).map(_ => new Or(_[4])),
|
).map(_ => new Or(_[4])),
|
||||||
P.seq(P.text('!'), r.ws, r.term).map(_ => new Not(_[2])),
|
P.seq(P.text('!'), r.ws, r.term).map(_ => new Not(_[2])),
|
||||||
|
P.seq(P.regex(/[<>]=?/), r.rawString).map(([op, val]) => {
|
||||||
|
val = +val
|
||||||
|
if (Number.isNaN(val)) {
|
||||||
|
throw new TypeError('value must be a number')
|
||||||
|
}
|
||||||
|
return new Comparison(op, val)
|
||||||
|
}),
|
||||||
P.seq(r.string, r.ws, P.text(':'), r.ws, r.term).map(
|
P.seq(r.string, r.ws, P.text(':'), r.ws, r.term).map(
|
||||||
_ => new Property(_[0], _[4])
|
_ => new Property(_[0], _[4])
|
||||||
),
|
),
|
||||||
|
Loading…
Reference in New Issue
Block a user