effect-grammar 0.2.0 → 0.4.0

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.
Files changed (53) hide show
  1. package/README.md +75 -136
  2. package/dist/ast.d.ts +115 -0
  3. package/dist/ast.d.ts.map +1 -0
  4. package/dist/ast.js +253 -0
  5. package/dist/ast.js.map +1 -0
  6. package/dist/combinators.d.ts +66 -21
  7. package/dist/combinators.d.ts.map +1 -1
  8. package/dist/combinators.js +150 -47
  9. package/dist/combinators.js.map +1 -1
  10. package/dist/core.d.ts +111 -39
  11. package/dist/core.d.ts.map +1 -1
  12. package/dist/core.js +24 -20
  13. package/dist/core.js.map +1 -1
  14. package/dist/env.d.ts +20 -0
  15. package/dist/env.d.ts.map +1 -0
  16. package/dist/env.js +63 -0
  17. package/dist/env.js.map +1 -0
  18. package/dist/errors.d.ts +34 -1
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +37 -4
  21. package/dist/errors.js.map +1 -1
  22. package/dist/gen.d.ts +7 -0
  23. package/dist/gen.d.ts.map +1 -0
  24. package/dist/gen.js +200 -0
  25. package/dist/gen.js.map +1 -0
  26. package/dist/index.d.ts +5 -5
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +3 -3
  29. package/dist/index.js.map +1 -1
  30. package/dist/parse.d.ts.map +1 -1
  31. package/dist/parse.js +152 -114
  32. package/dist/parse.js.map +1 -1
  33. package/dist/pattern.d.ts +5 -0
  34. package/dist/pattern.d.ts.map +1 -0
  35. package/dist/pattern.js +46 -0
  36. package/dist/pattern.js.map +1 -0
  37. package/dist/print.d.ts +2 -1
  38. package/dist/print.d.ts.map +1 -1
  39. package/dist/print.js +201 -89
  40. package/dist/print.js.map +1 -1
  41. package/dist/recovery.d.ts +10 -0
  42. package/dist/recovery.d.ts.map +1 -0
  43. package/dist/recovery.js +296 -0
  44. package/dist/recovery.js.map +1 -0
  45. package/dist/render.d.ts +4 -4
  46. package/dist/render.d.ts.map +1 -1
  47. package/dist/render.js +133 -42
  48. package/dist/render.js.map +1 -1
  49. package/dist/schema.d.ts +1 -1
  50. package/dist/schema.d.ts.map +1 -1
  51. package/dist/schema.js +12 -5
  52. package/dist/schema.js.map +1 -1
  53. package/package.json +32 -16
@@ -0,0 +1,296 @@
1
+ import { Equal, Option, Predicate, Result } from "effect";
2
+ import { nodeOf, } from "./core.js";
3
+ import { bind, cloneFrame, evaluate, frame, localValue } from "./env.js";
4
+ import { unifyPattern } from "./pattern.js";
5
+ const unsafeToNever = (value) => {
6
+ // SAFETY: erased Node callbacks accept the runtime value produced for that node.
7
+ return value;
8
+ };
9
+ const sameRef = (left, right) => left.scope === right.scope && left.slot === right.slot;
10
+ const addRef = (refs, ref) => {
11
+ if (!refs.some((candidate) => sameRef(candidate, ref)))
12
+ refs.push(ref);
13
+ };
14
+ const collectPatternRefs = (pattern, scope, slots) => {
15
+ switch (pattern._tag) {
16
+ case "Ref":
17
+ if (pattern.scope === scope)
18
+ slots.add(pattern.slot);
19
+ return;
20
+ case "Const":
21
+ return;
22
+ case "Object":
23
+ for (const [, field] of pattern.fields)
24
+ collectPatternRefs(field, scope, slots);
25
+ return;
26
+ case "Array":
27
+ for (const item of pattern.items)
28
+ collectPatternRefs(item, scope, slots);
29
+ }
30
+ };
31
+ const analyze = (grammar, seen) => {
32
+ const node = nodeOf(grammar);
33
+ if (seen.has(node))
34
+ return [];
35
+ seen.add(node);
36
+ const refs = [];
37
+ switch (node._tag) {
38
+ case "Wrap":
39
+ case "Label":
40
+ case "Transform":
41
+ case "TransformOrFail":
42
+ for (const ref of analyze(node.inner, seen))
43
+ addRef(refs, ref);
44
+ break;
45
+ case "Match":
46
+ if (node.scrutinee._tag === "Ref")
47
+ addRef(refs, node.scrutinee);
48
+ break;
49
+ case "Dependent":
50
+ if (node.recover !== undefined) {
51
+ for (const dep of node.deps)
52
+ if (dep._tag === "Ref")
53
+ addRef(refs, dep);
54
+ }
55
+ break;
56
+ case "Take":
57
+ case "RepeatExact":
58
+ if (node.count._tag === "Ref")
59
+ addRef(refs, node.count);
60
+ break;
61
+ case "Gen": {
62
+ const known = new Set();
63
+ collectPatternRefs(node.result, node.scope, known);
64
+ for (let index = node.steps.length - 1; index >= 0; index--) {
65
+ const step = node.steps[index];
66
+ if (step?._tag !== "Bind" || !known.has(step.slot))
67
+ continue;
68
+ for (const ref of analyze(step.grammar, seen)) {
69
+ if (ref.scope === node.scope)
70
+ known.add(ref.slot);
71
+ else
72
+ addRef(refs, ref);
73
+ }
74
+ }
75
+ break;
76
+ }
77
+ case "Suspend":
78
+ if (node.resolved !== undefined) {
79
+ for (const ref of analyze(node.resolved, seen))
80
+ addRef(refs, ref);
81
+ }
82
+ break;
83
+ case "Literal":
84
+ case "Regex":
85
+ case "Choice":
86
+ case "Many":
87
+ case "Optional":
88
+ case "Skip":
89
+ break;
90
+ }
91
+ seen.delete(node);
92
+ return refs;
93
+ };
94
+ export const recoverableRefs = (grammar) => analyze(grammar, new Set());
95
+ const assignmentFor = (ref, value, env) => {
96
+ const current = evaluate(ref, env);
97
+ if (Option.isSome(current))
98
+ return Equal.equals(current.value, value) ? [] : undefined;
99
+ return [{ ref, value }];
100
+ };
101
+ const mergePlans = (left, right) => {
102
+ const merged = [...left];
103
+ for (const assignment of right) {
104
+ const current = merged.find((candidate) => sameRef(candidate.ref, assignment.ref));
105
+ if (current !== undefined) {
106
+ if (!Equal.equals(current.value, assignment.value))
107
+ return undefined;
108
+ continue;
109
+ }
110
+ merged.push(assignment);
111
+ }
112
+ return merged;
113
+ };
114
+ const evaluateWithPlan = (expr, env, plan) => {
115
+ if (expr._tag === "Ref") {
116
+ const assignment = plan.find((candidate) => sameRef(candidate.ref, expr));
117
+ return assignment === undefined ? evaluate(expr, env) : Option.some(assignment.value);
118
+ }
119
+ const object = evaluateWithPlan(expr.object, env, plan);
120
+ if (Option.isNone(object) || object.value === null || object.value === undefined) {
121
+ return Option.none();
122
+ }
123
+ const boxed = Object(object.value);
124
+ return Object.hasOwn(boxed, expr.key) ? Option.some(boxed[expr.key]) : Option.none();
125
+ };
126
+ const applyAssignments = (state, assignments) => {
127
+ const local = cloneFrame(state.local);
128
+ let external = state.external;
129
+ for (const assignment of assignments) {
130
+ if (assignment.ref.scope === local.scope) {
131
+ const current = localValue(local, assignment.ref.slot);
132
+ if (Option.isSome(current) && !Equal.equals(current.value, assignment.value))
133
+ return undefined;
134
+ bind(local, assignment.ref.slot, assignment.value);
135
+ continue;
136
+ }
137
+ const merged = mergePlans(external, [assignment]);
138
+ if (merged === undefined)
139
+ return undefined;
140
+ external = merged;
141
+ }
142
+ return { local, external };
143
+ };
144
+ const recoverGen = (node, value, env) => {
145
+ const initial = frame(node.scope, node.slotCount, env);
146
+ if (unifyPattern(node.result, value, initial) !== undefined)
147
+ return [];
148
+ let states = [{ local: initial, external: [] }];
149
+ for (let index = node.steps.length - 1; index >= 0; index--) {
150
+ const step = node.steps[index];
151
+ if (step?._tag !== "Bind")
152
+ continue;
153
+ const next = [];
154
+ for (const state of states) {
155
+ const bound = localValue(state.local, step.slot);
156
+ if (Option.isNone(bound))
157
+ continue;
158
+ for (const plan of recoverPlans(step.grammar, bound.value, state.local)) {
159
+ const applied = applyAssignments(state, plan);
160
+ if (applied !== undefined)
161
+ next.push(applied);
162
+ }
163
+ }
164
+ states = next;
165
+ }
166
+ return states.map((state) => state.external);
167
+ };
168
+ const recoverDependent = (node, value, env) => {
169
+ if (node.recover === undefined)
170
+ return [[]];
171
+ let recovered;
172
+ try {
173
+ recovered = node.recover(unsafeToNever(value));
174
+ }
175
+ catch {
176
+ return [];
177
+ }
178
+ if (recovered === undefined)
179
+ return [];
180
+ let plan = [];
181
+ for (const [index, dep] of node.deps.entries()) {
182
+ const recoveredValue = recovered[index];
183
+ if (index >= recovered.length)
184
+ break;
185
+ if (dep._tag !== "Ref") {
186
+ const current = evaluate(dep, env);
187
+ if (Option.isNone(current) || !Equal.equals(current.value, recoveredValue))
188
+ return [];
189
+ continue;
190
+ }
191
+ const assignment = assignmentFor(dep, recoveredValue, env);
192
+ if (assignment === undefined)
193
+ return [];
194
+ const merged = mergePlans(plan, assignment);
195
+ if (merged === undefined)
196
+ return [];
197
+ plan = merged;
198
+ }
199
+ const values = node.deps.map((dep) => evaluateWithPlan(dep, env, plan));
200
+ if (values.some(Option.isNone))
201
+ return [plan];
202
+ let selected;
203
+ try {
204
+ selected = node.select(values.map((item) => unsafeToNever(Option.getOrThrow(item))));
205
+ }
206
+ catch {
207
+ return [];
208
+ }
209
+ if (selected === undefined)
210
+ return [plan];
211
+ const out = [];
212
+ for (const child of recoverPlans(selected, value, env)) {
213
+ const merged = mergePlans(plan, child);
214
+ if (merged !== undefined)
215
+ out.push(merged);
216
+ }
217
+ return out.length === 0 ? [plan] : out;
218
+ };
219
+ export const recoverPlans = (grammar, value, env) => {
220
+ const node = nodeOf(grammar);
221
+ switch (node._tag) {
222
+ case "Literal":
223
+ case "Regex":
224
+ case "Skip":
225
+ case "Many":
226
+ case "Optional":
227
+ return [[]];
228
+ case "Wrap":
229
+ case "Label":
230
+ return recoverPlans(node.inner, value, env);
231
+ case "Choice":
232
+ return node.options.flatMap((option) => recoverPlans(option, value, env));
233
+ case "Transform": {
234
+ try {
235
+ if (node.is?.(unsafeToNever(value)) === false)
236
+ return [];
237
+ return recoverPlans(node.inner, node.encode(unsafeToNever(value)), env);
238
+ }
239
+ catch {
240
+ return [];
241
+ }
242
+ }
243
+ case "TransformOrFail": {
244
+ try {
245
+ if (node.is?.(unsafeToNever(value)) === false)
246
+ return [];
247
+ const encoded = node.encode(unsafeToNever(value));
248
+ return Result.isFailure(encoded) ? [] : recoverPlans(node.inner, encoded.success, env);
249
+ }
250
+ catch {
251
+ return [];
252
+ }
253
+ }
254
+ case "Match": {
255
+ const current = evaluate(node.scrutinee, env);
256
+ const cases = Option.isSome(current)
257
+ ? node.cases.filter((matchCase) => Object.is(matchCase.key, current.value))
258
+ : node.cases;
259
+ const out = [];
260
+ for (const matchCase of cases) {
261
+ const selector = node.scrutinee._tag === "Ref"
262
+ ? assignmentFor(node.scrutinee, matchCase.key, env)
263
+ : Option.isSome(current) && Object.is(current.value, matchCase.key)
264
+ ? []
265
+ : undefined;
266
+ if (selector === undefined)
267
+ continue;
268
+ for (const child of recoverPlans(matchCase.grammar, value, env)) {
269
+ const merged = mergePlans(selector, child);
270
+ if (merged !== undefined)
271
+ out.push(merged);
272
+ }
273
+ }
274
+ return out;
275
+ }
276
+ case "Dependent":
277
+ return recoverDependent(node, value, env);
278
+ case "Take": {
279
+ if (node.count._tag !== "Ref" || !Predicate.isString(value))
280
+ return [[]];
281
+ const assignment = assignmentFor(node.count, value.length, env);
282
+ return assignment === undefined ? [] : [assignment];
283
+ }
284
+ case "RepeatExact": {
285
+ if (node.count._tag !== "Ref" || !Array.isArray(value))
286
+ return [[]];
287
+ const assignment = assignmentFor(node.count, value.length, env);
288
+ return assignment === undefined ? [] : [assignment];
289
+ }
290
+ case "Gen":
291
+ return recoverGen(node, value, env);
292
+ case "Suspend":
293
+ return node.resolved === undefined ? [[]] : recoverPlans(node.resolved, value, env);
294
+ }
295
+ };
296
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"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"}
package/dist/render.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { type Grammar } from "./core.ts";
2
- export declare const render: (g: Grammar<unknown>) => string;
3
- /** A short name for error messages: the regex or label name if there is one, else the rendering. */
4
- export declare const describe: (g: Grammar<unknown>) => string;
1
+ import { type GrammarInternal, type Step } from "./core.ts";
2
+ export declare const render: (grammar: GrammarInternal) => string;
3
+ export declare const describe: (grammar: GrammarInternal) => string;
4
+ export declare const describeStep: (step: Step, index: number) => string;
5
5
  //# sourceMappingURL=render.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,OAAO,EAA0C,MAAM,WAAW,CAAA;AA6D7F,eAAO,MAAM,MAAM,MAAO,OAAO,CAAC,OAAO,CAAC,KAAG,MAA4B,CAAA;AAEzE,oGAAoG;AACpG,eAAO,MAAM,QAAQ,MAAO,OAAO,CAAC,OAAO,CAAC,KAAG,MAC+B,CAAA"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,eAAe,EAMpB,KAAK,IAAI,EACV,MAAM,WAAW,CAAA;AA6KlB,eAAO,MAAM,MAAM,YAAa,eAAe,KAAG,MACc,CAAA;AAEhE,eAAO,MAAM,QAAQ,YAAa,eAAe,KAAG,MAGnD,CAAA;AAED,eAAO,MAAM,YAAY,SAAU,IAAI,SAAS,MAAM,KAAG,MACR,CAAA"}
package/dist/render.js CHANGED
@@ -1,64 +1,155 @@
1
- import { isField, resolve } from "./core.js";
1
+ import { Predicate } from "effect";
2
+ import { nodeOf, resolve, } from "./core.js";
3
+ import { preview } from "./errors.js";
4
+ const ChoicePrecedence = 1;
5
+ const SequencePrecedence = 2;
6
+ const PostfixPrecedence = 3;
7
+ const AtomPrecedence = 4;
2
8
  const repetition = ({ min, max }) => {
3
9
  if (max === Number.POSITIVE_INFINITY)
4
10
  return min === 0 ? "*" : min === 1 ? "+" : `{${min},}`;
5
11
  return min === max ? `{${min}}` : `{${min},${max}}`;
6
12
  };
7
- const words = (parts) => parts.filter((p) => p !== "").join(" ");
8
- const showPart = (p, seen) => isField(p) ? `${p.name}:${show(p.grammar, seen)}` : show(p, seen);
9
- const show = (g, seen) => {
10
- const n = g.node;
11
- switch (n._tag) {
13
+ const parenthesize = (fragment, minimum) => fragment.precedence < minimum ? `(${fragment.text})` : fragment.text;
14
+ const sequence = (fragments) => ({
15
+ precedence: SequencePrecedence,
16
+ text: fragments
17
+ .filter((fragment) => fragment.text !== "")
18
+ .map((fragment) => parenthesize(fragment, SequencePrecedence))
19
+ .join(" "),
20
+ });
21
+ const namesFor = (context, scope) => {
22
+ const existing = context.names.get(scope);
23
+ if (existing !== undefined)
24
+ return existing;
25
+ const names = new Map();
26
+ context.names.set(scope, names);
27
+ return names;
28
+ };
29
+ const nameBindings = (pattern, path, scope, names) => {
30
+ switch (pattern._tag) {
31
+ case "Ref":
32
+ if (pattern.scope === scope && path !== undefined)
33
+ names.set(pattern.slot, path);
34
+ return;
35
+ case "Const":
36
+ return;
37
+ case "Object":
38
+ for (const [key, field] of pattern.fields) {
39
+ nameBindings(field, path === undefined ? key : `${path}.${key}`, scope, names);
40
+ }
41
+ return;
42
+ case "Array":
43
+ pattern.items.forEach((item, index) => {
44
+ nameBindings(item, path === undefined ? String(index) : `${path}.${index}`, scope, names);
45
+ });
46
+ }
47
+ };
48
+ const showExpr = (expr, context) => {
49
+ if (expr._tag === "Ref")
50
+ return context.names.get(expr.scope)?.get(expr.slot) ?? `$${expr.slot}`;
51
+ const object = showExpr(expr.object, context);
52
+ return Predicate.isString(expr.key) && /^[A-Za-z_$][\w$]*$/.test(expr.key)
53
+ ? `${object}.${expr.key}`
54
+ : `${object}[${preview(expr.key)}]`;
55
+ };
56
+ const show = (grammar, context) => {
57
+ const node = nodeOf(grammar);
58
+ switch (node._tag) {
12
59
  case "Literal":
13
- return n.value === "" ? "" : JSON.stringify(n.value);
60
+ return {
61
+ precedence: AtomPrecedence,
62
+ text: node.value === "" ? "" : JSON.stringify(node.value),
63
+ };
14
64
  case "Regex":
15
- return `<${n.name}>`;
16
- case "Seq":
17
- return words(n.parts.map((p) => showPart(p, seen)));
65
+ return { precedence: AtomPrecedence, text: `<${node.name}>` };
18
66
  case "Gen": {
19
- // Replay with no values; a generator that branches on a value may throw.
20
- const parts = [];
21
- try {
22
- const it = n.run();
23
- for (let r = it.next(); !r.done; r = it.next(undefined))
24
- parts.push(showPart(r.value, seen));
25
- }
26
- catch {
27
- parts.push("…");
28
- }
29
- return words(parts);
67
+ const names = namesFor(context, node.scope);
68
+ if (context.includeBindings)
69
+ nameBindings(node.result, undefined, node.scope, names);
70
+ return sequence(node.steps.map((step) => {
71
+ const inner = show(step.grammar, context);
72
+ const name = step._tag === "Bind" ? names.get(step.slot) : undefined;
73
+ return name === undefined
74
+ ? inner
75
+ : {
76
+ precedence: AtomPrecedence,
77
+ text: `${name}:${parenthesize(inner, PostfixPrecedence)}`,
78
+ };
79
+ }));
30
80
  }
31
81
  case "Wrap":
32
- return words([show(n.open, seen), show(n.inner, seen), show(n.close, seen)]);
82
+ return sequence([
83
+ show(node.open, context),
84
+ show(node.inner, context),
85
+ show(node.close, context),
86
+ ]);
33
87
  case "Choice":
34
- return `(${n.options.map((o) => show(o, seen)).join(" | ")})`;
88
+ return {
89
+ precedence: ChoicePrecedence,
90
+ text: node.options
91
+ .map((option) => parenthesize(show(option, context), SequencePrecedence))
92
+ .join(" | "),
93
+ };
35
94
  case "Many": {
36
- const inner = show(n.inner, seen);
37
- const sep = show(n.sep, seen);
38
- if (sep === "")
39
- return `(${inner})${repetition(n)}`;
40
- const rest = repetition({ min: Math.max(0, n.min - 1), max: n.max - 1 });
41
- const body = `${inner} (${sep} ${inner})${rest}`;
42
- return n.min === 0 ? `(${body})?` : body;
95
+ const inner = show(node.inner, context);
96
+ const sep = show(node.sep, context);
97
+ if (sep.text === "" || node.max === 0) {
98
+ return {
99
+ precedence: PostfixPrecedence,
100
+ text: `(${inner.text})${repetition(node)}`,
101
+ };
102
+ }
103
+ const rest = repetition({
104
+ min: Math.max(0, node.min - 1),
105
+ max: node.max === Number.POSITIVE_INFINITY ? node.max : Math.max(0, node.max - 1),
106
+ });
107
+ const body = `${parenthesize(inner, SequencePrecedence)} (${parenthesize(sep, SequencePrecedence)} ${parenthesize(inner, SequencePrecedence)})${rest}`;
108
+ return node.min === 0
109
+ ? { precedence: PostfixPrecedence, text: `(${body})?` }
110
+ : { precedence: SequencePrecedence, text: body };
43
111
  }
44
112
  case "Optional":
45
- return `(${show(n.inner, seen)})?`;
113
+ return { precedence: PostfixPrecedence, text: `(${show(node.inner, context).text})?` };
46
114
  case "Transform":
47
115
  case "Label":
48
- return show(n.inner, seen);
116
+ return show(node.inner, context);
49
117
  case "Skip":
50
- return n.show ? show(n.inner, seen) : "";
118
+ return node.show ? show(node.inner, context) : { precedence: AtomPrecedence, text: "" };
51
119
  case "Suspend": {
52
- if (seen.has(n))
53
- return n.name ?? "…";
54
- seen.add(n);
55
- const s = show(resolve(n), seen);
56
- seen.delete(n);
57
- return s;
120
+ if (context.seen.has(node)) {
121
+ return { precedence: AtomPrecedence, text: node.name ?? "…" };
122
+ }
123
+ context.seen.add(node);
124
+ const fragment = show(resolve(node), context);
125
+ context.seen.delete(node);
126
+ return fragment;
58
127
  }
128
+ case "Match": {
129
+ const cases = node.cases.map((matchCase) => `${preview(matchCase.key)} => ${show(matchCase.grammar, context).text}`);
130
+ return {
131
+ precedence: AtomPrecedence,
132
+ text: `match(${showExpr(node.scrutinee, context)}){${cases.join(" | ")}}`,
133
+ };
134
+ }
135
+ case "Take":
136
+ return { precedence: AtomPrecedence, text: `<char>{${showExpr(node.count, context)}}` };
137
+ case "RepeatExact":
138
+ return {
139
+ precedence: PostfixPrecedence,
140
+ text: `(${show(node.inner, context).text}){${showExpr(node.count, context)}}`,
141
+ };
59
142
  }
60
143
  };
61
- export const render = (g) => show(g, new Set());
62
- /** A short name for error messages: the regex or label name if there is one, else the rendering. */
63
- export const describe = (g) => g.node._tag === "Regex" || g.node._tag === "Label" ? g.node.name : render(g);
144
+ const context = (includeBindings) => ({
145
+ seen: new Set(),
146
+ names: new Map(),
147
+ includeBindings,
148
+ });
149
+ export const render = (grammar) => parenthesize(show(grammar, context(true)), SequencePrecedence);
150
+ export const describe = (grammar) => {
151
+ const node = nodeOf(grammar);
152
+ return node._tag === "Regex" || node._tag === "Label" ? node.name : render(grammar);
153
+ };
154
+ export const describeStep = (step, index) => `step ${index + 1} (${describe(step.grammar)})`;
64
155
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Schema } from "effect";
2
2
  import type { Grammar } from "./core.ts";
3
- export declare const toSchema: <S extends Schema.Top>(grammar: Grammar<S["Type"]>, target: S, options?: {
3
+ export declare const codec: <S extends Schema.Top, A extends S["Encoded"]>(grammar: Grammar<A>, target: S, options?: {
4
4
  readonly identifier?: string;
5
5
  }) => Schema.decodeTo<S, Schema.String, never, never>;
6
6
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAqC,MAAM,QAAQ,CAAA;AAElF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,CAAC,GAAG,WAClC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,UACnB,CAAC,YACC;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,oDAqBzC,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAqC,MAAM,QAAQ,CAAA;AAE1E,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,WAAW,CAAA;AAc/C,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,WACvD,OAAO,CAAC,CAAC,CAAC,UACX,CAAC,YACC;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,oDAiBzC,CAAA"}
package/dist/schema.js CHANGED
@@ -1,9 +1,16 @@
1
- import { Effect, Option, Schema, SchemaIssue, SchemaTransformation } from "effect";
1
+ import { Effect, Schema, SchemaIssue, SchemaTransformation } from "effect";
2
+ import { PrintError } from "./errors.js";
2
3
  import { parse } from "./parse.js";
3
- import { print } from "./print.js";
4
+ import { printUnknown } from "./print.js";
4
5
  import { render } from "./render.js";
5
- export const toSchema = (grammar, target, options) => Schema.String.pipe(Schema.decodeTo(target, SchemaTransformation.transformOrFail({
6
- decode: (s) => Effect.fromResult(parse(grammar, s)).pipe(Effect.mapError(({ message }) => new SchemaIssue.InvalidValue(Option.some(s), { message }))),
7
- encode: (a) => Effect.fromResult(print(grammar, a)).pipe(Effect.mapError(({ message }) => new SchemaIssue.InvalidValue(Option.some(a), { message }))),
6
+ const printIssueToSchema = (actual, issue) => {
7
+ if (issue._tag === "AtPath") {
8
+ return new SchemaIssue.Pointer([issue.path], printIssueToSchema(actual, issue.issue));
9
+ }
10
+ return new SchemaIssue.InvalidValue({ message: PrintError.format(issue) }, actual);
11
+ };
12
+ export const codec = (grammar, target, options) => Schema.String.pipe(Schema.decodeTo(target, SchemaTransformation.transformOrFail({
13
+ decode: (text) => Effect.fromResult(parse(grammar, text)).pipe(Effect.mapError(({ message }) => new SchemaIssue.InvalidValue({ message }, text))),
14
+ encode: (value) => Effect.fromResult(printUnknown(grammar, value)).pipe(Effect.mapError((error) => printIssueToSchema(value, error.issue))),
8
15
  })), Schema.annotate({ ...options, description: render(grammar) }));
9
16
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAA;AAGlF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAA2B,EAC3B,MAAS,EACT,OAA0C,EAC1C,EAAE,CACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,MAAM,CAAC,QAAQ,CACb,MAAM,EACN,oBAAoB,CAAC,eAAe,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CACZ,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CACvC,MAAM,CAAC,QAAQ,CACb,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAC3E,CACF;IACH,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CACZ,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CACvC,MAAM,CAAC,QAAQ,CACb,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAC3E,CACF;CACJ,CAAC,CACH,EACD,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAC9D,CAAA"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAA;AAI1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,kBAAkB,GAAG,CAAC,MAAa,EAAE,KAAiB,EAAqB,EAAE;IACjF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IACvF,CAAC;IACD,OAAO,IAAI,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;AACpF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,OAAmB,EACnB,MAAS,EACT,OAA0C,EAC1C,EAAE,CACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,MAAM,CAAC,QAAQ,CACb,MAAM,EACN,oBAAoB,CAAC,eAAe,CAAuB;IACzD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAClF;IACH,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CACnE;CACJ,CAAC,CACH,EACD,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAC9D,CAAA"}