@bcts/dcbor-pattern 1.0.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +48 -0
- package/README.md +14 -0
- package/dist/index.cjs +6561 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2732 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +2732 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.iife.js +6562 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/index.mjs +6244 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +85 -0
- package/src/error.ts +333 -0
- package/src/format.ts +299 -0
- package/src/index.ts +20 -0
- package/src/interval.ts +230 -0
- package/src/parse/index.ts +95 -0
- package/src/parse/meta/and-parser.ts +47 -0
- package/src/parse/meta/capture-parser.ts +56 -0
- package/src/parse/meta/index.ts +13 -0
- package/src/parse/meta/not-parser.ts +28 -0
- package/src/parse/meta/or-parser.ts +47 -0
- package/src/parse/meta/primary-parser.ts +420 -0
- package/src/parse/meta/repeat-parser.ts +133 -0
- package/src/parse/meta/search-parser.ts +56 -0
- package/src/parse/parse-registry.ts +31 -0
- package/src/parse/structure/array-parser.ts +210 -0
- package/src/parse/structure/index.ts +9 -0
- package/src/parse/structure/map-parser.ts +128 -0
- package/src/parse/structure/tagged-parser.ts +269 -0
- package/src/parse/token.ts +997 -0
- package/src/parse/value/bool-parser.ts +33 -0
- package/src/parse/value/bytestring-parser.ts +42 -0
- package/src/parse/value/date-parser.ts +24 -0
- package/src/parse/value/digest-parser.ts +24 -0
- package/src/parse/value/index.ts +14 -0
- package/src/parse/value/known-value-parser.ts +24 -0
- package/src/parse/value/null-parser.ts +19 -0
- package/src/parse/value/number-parser.ts +19 -0
- package/src/parse/value/text-parser.ts +43 -0
- package/src/pattern/index.ts +740 -0
- package/src/pattern/match-registry.ts +137 -0
- package/src/pattern/matcher.ts +388 -0
- package/src/pattern/meta/and-pattern.ts +56 -0
- package/src/pattern/meta/any-pattern.ts +43 -0
- package/src/pattern/meta/capture-pattern.ts +57 -0
- package/src/pattern/meta/index.ts +168 -0
- package/src/pattern/meta/not-pattern.ts +70 -0
- package/src/pattern/meta/or-pattern.ts +56 -0
- package/src/pattern/meta/repeat-pattern.ts +117 -0
- package/src/pattern/meta/search-pattern.ts +298 -0
- package/src/pattern/meta/sequence-pattern.ts +72 -0
- package/src/pattern/structure/array-pattern/assigner.ts +95 -0
- package/src/pattern/structure/array-pattern/backtrack.ts +240 -0
- package/src/pattern/structure/array-pattern/helpers.ts +140 -0
- package/src/pattern/structure/array-pattern/index.ts +502 -0
- package/src/pattern/structure/index.ts +122 -0
- package/src/pattern/structure/map-pattern.ts +255 -0
- package/src/pattern/structure/tagged-pattern.ts +190 -0
- package/src/pattern/value/bool-pattern.ts +67 -0
- package/src/pattern/value/bytes-utils.ts +48 -0
- package/src/pattern/value/bytestring-pattern.ts +111 -0
- package/src/pattern/value/date-pattern.ts +162 -0
- package/src/pattern/value/digest-pattern.ts +136 -0
- package/src/pattern/value/index.ts +168 -0
- package/src/pattern/value/known-value-pattern.ts +123 -0
- package/src/pattern/value/null-pattern.ts +46 -0
- package/src/pattern/value/number-pattern.ts +181 -0
- package/src/pattern/value/text-pattern.ts +82 -0
- package/src/pattern/vm.ts +619 -0
- package/src/quantifier.ts +185 -0
- package/src/reluctance.ts +65 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Number pattern for dCBOR pattern matching.
|
|
3
|
+
*
|
|
4
|
+
* @module pattern/value/number-pattern
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Cbor } from "@bcts/dcbor";
|
|
8
|
+
import { asNumber, isNumber } from "@bcts/dcbor";
|
|
9
|
+
import type { Path } from "../../format";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Pattern for matching number values in dCBOR.
|
|
13
|
+
*/
|
|
14
|
+
export type NumberPattern =
|
|
15
|
+
| { readonly variant: "Any" }
|
|
16
|
+
| { readonly variant: "Value"; readonly value: number }
|
|
17
|
+
| { readonly variant: "Range"; readonly min: number; readonly max: number }
|
|
18
|
+
| { readonly variant: "GreaterThan"; readonly value: number }
|
|
19
|
+
| { readonly variant: "GreaterThanOrEqual"; readonly value: number }
|
|
20
|
+
| { readonly variant: "LessThan"; readonly value: number }
|
|
21
|
+
| { readonly variant: "LessThanOrEqual"; readonly value: number }
|
|
22
|
+
| { readonly variant: "NaN" }
|
|
23
|
+
| { readonly variant: "Infinity" }
|
|
24
|
+
| { readonly variant: "NegInfinity" };
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Creates a NumberPattern that matches any number.
|
|
28
|
+
*/
|
|
29
|
+
export const numberPatternAny = (): NumberPattern => ({ variant: "Any" });
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Creates a NumberPattern that matches a specific number.
|
|
33
|
+
*/
|
|
34
|
+
export const numberPatternValue = (value: number): NumberPattern => ({
|
|
35
|
+
variant: "Value",
|
|
36
|
+
value,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Creates a NumberPattern that matches numbers within a range (inclusive).
|
|
41
|
+
*/
|
|
42
|
+
export const numberPatternRange = (min: number, max: number): NumberPattern => ({
|
|
43
|
+
variant: "Range",
|
|
44
|
+
min,
|
|
45
|
+
max,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Creates a NumberPattern that matches numbers greater than a value.
|
|
50
|
+
*/
|
|
51
|
+
export const numberPatternGreaterThan = (value: number): NumberPattern => ({
|
|
52
|
+
variant: "GreaterThan",
|
|
53
|
+
value,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Creates a NumberPattern that matches numbers greater than or equal to a value.
|
|
58
|
+
*/
|
|
59
|
+
export const numberPatternGreaterThanOrEqual = (value: number): NumberPattern => ({
|
|
60
|
+
variant: "GreaterThanOrEqual",
|
|
61
|
+
value,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Creates a NumberPattern that matches numbers less than a value.
|
|
66
|
+
*/
|
|
67
|
+
export const numberPatternLessThan = (value: number): NumberPattern => ({
|
|
68
|
+
variant: "LessThan",
|
|
69
|
+
value,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Creates a NumberPattern that matches numbers less than or equal to a value.
|
|
74
|
+
*/
|
|
75
|
+
export const numberPatternLessThanOrEqual = (value: number): NumberPattern => ({
|
|
76
|
+
variant: "LessThanOrEqual",
|
|
77
|
+
value,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Creates a NumberPattern that matches NaN.
|
|
82
|
+
*/
|
|
83
|
+
export const numberPatternNaN = (): NumberPattern => ({ variant: "NaN" });
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Creates a NumberPattern that matches positive infinity.
|
|
87
|
+
*/
|
|
88
|
+
export const numberPatternInfinity = (): NumberPattern => ({
|
|
89
|
+
variant: "Infinity",
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Creates a NumberPattern that matches negative infinity.
|
|
94
|
+
*/
|
|
95
|
+
export const numberPatternNegInfinity = (): NumberPattern => ({
|
|
96
|
+
variant: "NegInfinity",
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Tests if a CBOR value matches this number pattern.
|
|
101
|
+
*/
|
|
102
|
+
export const numberPatternMatches = (pattern: NumberPattern, haystack: Cbor): boolean => {
|
|
103
|
+
switch (pattern.variant) {
|
|
104
|
+
case "Any":
|
|
105
|
+
return isNumber(haystack);
|
|
106
|
+
case "Value": {
|
|
107
|
+
const value = asNumber(haystack);
|
|
108
|
+
return value !== undefined && value === pattern.value;
|
|
109
|
+
}
|
|
110
|
+
case "Range": {
|
|
111
|
+
const value = asNumber(haystack);
|
|
112
|
+
return value !== undefined && value >= pattern.min && value <= pattern.max;
|
|
113
|
+
}
|
|
114
|
+
case "GreaterThan": {
|
|
115
|
+
const value = asNumber(haystack);
|
|
116
|
+
return value !== undefined && value > pattern.value;
|
|
117
|
+
}
|
|
118
|
+
case "GreaterThanOrEqual": {
|
|
119
|
+
const value = asNumber(haystack);
|
|
120
|
+
return value !== undefined && value >= pattern.value;
|
|
121
|
+
}
|
|
122
|
+
case "LessThan": {
|
|
123
|
+
const value = asNumber(haystack);
|
|
124
|
+
return value !== undefined && value < pattern.value;
|
|
125
|
+
}
|
|
126
|
+
case "LessThanOrEqual": {
|
|
127
|
+
const value = asNumber(haystack);
|
|
128
|
+
return value !== undefined && value <= pattern.value;
|
|
129
|
+
}
|
|
130
|
+
case "NaN": {
|
|
131
|
+
const value = asNumber(haystack);
|
|
132
|
+
return value !== undefined && Number.isNaN(value);
|
|
133
|
+
}
|
|
134
|
+
case "Infinity": {
|
|
135
|
+
const value = asNumber(haystack);
|
|
136
|
+
return value !== undefined && value === Number.POSITIVE_INFINITY;
|
|
137
|
+
}
|
|
138
|
+
case "NegInfinity": {
|
|
139
|
+
const value = asNumber(haystack);
|
|
140
|
+
return value !== undefined && value === Number.NEGATIVE_INFINITY;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Returns paths to matching number values.
|
|
147
|
+
*/
|
|
148
|
+
export const numberPatternPaths = (pattern: NumberPattern, haystack: Cbor): Path[] => {
|
|
149
|
+
if (numberPatternMatches(pattern, haystack)) {
|
|
150
|
+
return [[haystack]];
|
|
151
|
+
}
|
|
152
|
+
return [];
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Formats a NumberPattern as a string.
|
|
157
|
+
*/
|
|
158
|
+
export const numberPatternDisplay = (pattern: NumberPattern): string => {
|
|
159
|
+
switch (pattern.variant) {
|
|
160
|
+
case "Any":
|
|
161
|
+
return "number";
|
|
162
|
+
case "Value":
|
|
163
|
+
return String(pattern.value);
|
|
164
|
+
case "Range":
|
|
165
|
+
return `${pattern.min}..${pattern.max}`;
|
|
166
|
+
case "GreaterThan":
|
|
167
|
+
return `>${pattern.value}`;
|
|
168
|
+
case "GreaterThanOrEqual":
|
|
169
|
+
return `>=${pattern.value}`;
|
|
170
|
+
case "LessThan":
|
|
171
|
+
return `<${pattern.value}`;
|
|
172
|
+
case "LessThanOrEqual":
|
|
173
|
+
return `<=${pattern.value}`;
|
|
174
|
+
case "NaN":
|
|
175
|
+
return "NaN";
|
|
176
|
+
case "Infinity":
|
|
177
|
+
return "Infinity";
|
|
178
|
+
case "NegInfinity":
|
|
179
|
+
return "-Infinity";
|
|
180
|
+
}
|
|
181
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text pattern for dCBOR pattern matching.
|
|
3
|
+
*
|
|
4
|
+
* @module pattern/value/text-pattern
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Cbor } from "@bcts/dcbor";
|
|
8
|
+
import { asText } from "@bcts/dcbor";
|
|
9
|
+
import type { Path } from "../../format";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Pattern for matching text values in dCBOR.
|
|
13
|
+
*/
|
|
14
|
+
export type TextPattern =
|
|
15
|
+
| { readonly variant: "Any" }
|
|
16
|
+
| { readonly variant: "Value"; readonly value: string }
|
|
17
|
+
| { readonly variant: "Regex"; readonly pattern: RegExp };
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Creates a TextPattern that matches any text.
|
|
21
|
+
*/
|
|
22
|
+
export const textPatternAny = (): TextPattern => ({ variant: "Any" });
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Creates a TextPattern that matches a specific text value.
|
|
26
|
+
*/
|
|
27
|
+
export const textPatternValue = (value: string): TextPattern => ({
|
|
28
|
+
variant: "Value",
|
|
29
|
+
value,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Creates a TextPattern that matches text by regex.
|
|
34
|
+
*/
|
|
35
|
+
export const textPatternRegex = (pattern: RegExp): TextPattern => ({
|
|
36
|
+
variant: "Regex",
|
|
37
|
+
pattern,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Tests if a CBOR value matches this text pattern.
|
|
42
|
+
*/
|
|
43
|
+
export const textPatternMatches = (pattern: TextPattern, haystack: Cbor): boolean => {
|
|
44
|
+
const value = asText(haystack);
|
|
45
|
+
if (value === undefined) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
switch (pattern.variant) {
|
|
49
|
+
case "Any":
|
|
50
|
+
return true;
|
|
51
|
+
case "Value":
|
|
52
|
+
return value === pattern.value;
|
|
53
|
+
case "Regex":
|
|
54
|
+
return pattern.pattern.test(value);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Returns paths to matching text values.
|
|
60
|
+
*/
|
|
61
|
+
export const textPatternPaths = (pattern: TextPattern, haystack: Cbor): Path[] => {
|
|
62
|
+
if (textPatternMatches(pattern, haystack)) {
|
|
63
|
+
return [[haystack]];
|
|
64
|
+
}
|
|
65
|
+
return [];
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Formats a TextPattern as a string.
|
|
70
|
+
*/
|
|
71
|
+
export const textPatternDisplay = (pattern: TextPattern): string => {
|
|
72
|
+
switch (pattern.variant) {
|
|
73
|
+
case "Any":
|
|
74
|
+
return "text";
|
|
75
|
+
case "Value": {
|
|
76
|
+
const escaped = pattern.value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
77
|
+
return `"${escaped}"`;
|
|
78
|
+
}
|
|
79
|
+
case "Regex":
|
|
80
|
+
return `/${pattern.pattern.source}/`;
|
|
81
|
+
}
|
|
82
|
+
};
|