behavior-contracts 0.2.4 → 0.2.6
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/dist/generator/emit-raw-abi-go.d.ts +45 -0
- package/dist/generator/emit-raw-abi-go.d.ts.map +1 -0
- package/dist/generator/emit-raw-abi-go.js +345 -0
- package/dist/generator/emit-raw-abi-go.js.map +1 -0
- package/dist/generator/emit-raw-abi-rust.d.ts +45 -0
- package/dist/generator/emit-raw-abi-rust.d.ts.map +1 -0
- package/dist/generator/emit-raw-abi-rust.js +380 -0
- package/dist/generator/emit-raw-abi-rust.js.map +1 -0
- package/dist/generator/emit-straightline-go.d.ts +27 -46
- package/dist/generator/emit-straightline-go.d.ts.map +1 -1
- package/dist/generator/emit-straightline-go.js +688 -190
- package/dist/generator/emit-straightline-go.js.map +1 -1
- package/dist/generator/emit-straightline-php.d.ts +1 -1
- package/dist/generator/emit-straightline-php.d.ts.map +1 -1
- package/dist/generator/emit-straightline-php.js +451 -20
- package/dist/generator/emit-straightline-php.js.map +1 -1
- package/dist/generator/emit-straightline-python.d.ts.map +1 -1
- package/dist/generator/emit-straightline-python.js +426 -22
- package/dist/generator/emit-straightline-python.js.map +1 -1
- package/dist/generator/emit-straightline-rust.d.ts +5 -0
- package/dist/generator/emit-straightline-rust.d.ts.map +1 -1
- package/dist/generator/emit-straightline-rust.js +596 -48
- package/dist/generator/emit-straightline-rust.js.map +1 -1
- package/dist/generator/emit-straightline-typed-go.d.ts +95 -2
- package/dist/generator/emit-straightline-typed-go.d.ts.map +1 -1
- package/dist/generator/emit-straightline-typed-go.js +42 -3
- package/dist/generator/emit-straightline-typed-go.js.map +1 -1
- package/dist/generator/emit-straightline-typed-rust.d.ts +98 -2
- package/dist/generator/emit-straightline-typed-rust.d.ts.map +1 -1
- package/dist/generator/emit-straightline-typed-rust.js +50 -7
- package/dist/generator/emit-straightline-typed-rust.js.map +1 -1
- package/dist/generator/emit-straightline-typescript.d.ts +26 -15
- package/dist/generator/emit-straightline-typescript.d.ts.map +1 -1
- package/dist/generator/emit-straightline-typescript.js +703 -147
- package/dist/generator/emit-straightline-typescript.js.map +1 -1
- package/dist/generator/index.d.ts +4 -2
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +11 -2
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/literal.d.ts +3 -1
- package/dist/generator/literal.d.ts.map +1 -1
- package/dist/generator/literal.js +13 -4
- package/dist/generator/literal.js.map +1 -1
- package/dist/generator/straightline.d.ts +81 -0
- package/dist/generator/straightline.d.ts.map +1 -1
- package/dist/generator/straightline.js +176 -0
- package/dist/generator/straightline.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* emit-raw-abi-go.ts — Go RAW handler ABI emitter (bc#76): the de-boxed typed path.
|
|
3
|
+
*
|
|
4
|
+
* # What this replaces
|
|
5
|
+
*
|
|
6
|
+
* The boxed typed emitter (emit-straightline-typed-go.ts) generates
|
|
7
|
+
* `marshal_T*(raw Value) (T*, error)`: the handler builds a full dynamic `*Obj` Value tree
|
|
8
|
+
* and the marshaller WALKS it into a struct — a Value->struct conversion LAYERED on top of
|
|
9
|
+
* boxing. The residual ~22% Rust gap #75 measured is that Value/*Obj clone at the ABI.
|
|
10
|
+
*
|
|
11
|
+
* # What this emits
|
|
12
|
+
*
|
|
13
|
+
* A RAW module that materializes structs DIRECTLY from a `RawValue` (native-backed, NOT a
|
|
14
|
+
* Value/*Obj — see go/rawabi.go). The generated code:
|
|
15
|
+
*
|
|
16
|
+
* - `marshal_raw_T*(raw dslcontracts.RawValue) (T*, error)`: reads each field via
|
|
17
|
+
* `RawRow.Field` / native scalar type-switch / `[]RawValue` iteration — straight into
|
|
18
|
+
* the concrete struct. It NEVER constructs a `*Obj`/`Value` on the row data plane.
|
|
19
|
+
* - `run_typed_raw_<comp>(handlers RawComponentExec, input *Obj) (Value, error)`: drives
|
|
20
|
+
* the plan with the RunPlan primitive (plan SSoT, reused), evaluates ports with the
|
|
21
|
+
* native/primitive straight-line dialect (unchanged — ports are Value-space, off the
|
|
22
|
+
* row data plane), calls the RAW handler (`ExecRawHandler` -> `RawValue`), and
|
|
23
|
+
* materializes the node struct via `marshal_raw_T*` at the boundary. The output is
|
|
24
|
+
* assembled as a struct and serialized to a Value ONLY at the final return boundary
|
|
25
|
+
* (the equivalence pin), exactly as the boxed typed path does — so the OBSERVED result
|
|
26
|
+
* equals run_behavior while the data plane never boxed.
|
|
27
|
+
* - `BindRaw(handlers RawComponentExec) map[string]func(*Obj)(Value,error)`: the raw
|
|
28
|
+
* dispatch surface (mirrors Bind).
|
|
29
|
+
*
|
|
30
|
+
* # Scope
|
|
31
|
+
*
|
|
32
|
+
* The raw de-box covers the componentRef read-handler shape — exactly graphddb's row
|
|
33
|
+
* hydrator (AttributeValue -> struct) where the measured gap lives. Typed map/cond nodes
|
|
34
|
+
* are out of raw scope for now: the emitter LOUD-fails (UNSUPPORTED_NODE_STRAIGHTLINE) so a
|
|
35
|
+
* consumer regenerates those components on the boxed typed path rather than getting a module
|
|
36
|
+
* that silently re-boxes. TS/py/php are unaffected (runtime de-box targets are go/rust).
|
|
37
|
+
*/
|
|
38
|
+
import type { EmitterPlugin } from "./core.js";
|
|
39
|
+
/**
|
|
40
|
+
* goRawAbiEmitter — language id `go-typed-raw` (bc#76). Emits the straight-line body (for
|
|
41
|
+
* untyped components / helpers) plus the RAW-ABI de-boxed layer (struct materialized directly
|
|
42
|
+
* from RawValue) and the BindRaw surface. Requires at least one outType/outputType annotation.
|
|
43
|
+
*/
|
|
44
|
+
export declare const goRawAbiEmitter: EmitterPlugin;
|
|
45
|
+
//# sourceMappingURL=emit-raw-abi-go.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-raw-abi-go.d.ts","sourceRoot":"","sources":["../../src/generator/emit-raw-abi-go.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,WAAW,CAAC;AAuY5D;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,aAM7B,CAAC"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { GeneratorFailure } from "./core.js";
|
|
2
|
+
import { buildTypePlan, deriveTypeRef, findDecl } from "./typed.js";
|
|
3
|
+
import { goTypedInternals } from "./emit-straightline-typed-go.js";
|
|
4
|
+
const { PKG, sanitize, goFieldName, renderTypeRef, goScalar, typedLocal, isTypedComponent, collectTypedNodes, hasAnyTypeAnnotation, emitTypeDecls, emitSerializers, emitMarshallers, serializeTyped, emitTypedValue, buildComponentPlanForTyped, emitOpsLiteral, emitBehaviorPlanLiteral, goPortVar, setGoForceRunPlanHelpers, goStraightlineEmitter, } = goTypedInternals;
|
|
5
|
+
// ── RAW marshallers (the de-box): read a RawValue field-by-field into a concrete struct ──
|
|
6
|
+
/** Emit `marshal_raw_T*` for every named struct in the plan. */
|
|
7
|
+
function emitRawMarshallers(plan) {
|
|
8
|
+
if (plan.decls.length === 0)
|
|
9
|
+
return "";
|
|
10
|
+
return plan.decls.map((d) => emitOneRawMarshaller(d, plan)).join("\n\n");
|
|
11
|
+
}
|
|
12
|
+
function emitOneRawMarshaller(d, plan) {
|
|
13
|
+
const lines = [];
|
|
14
|
+
lines.push(`func marshal_raw_${d.name}(raw ${PKG}.RawValue) (${d.name}, error) {`);
|
|
15
|
+
lines.push(`\tvar out ${d.name}`);
|
|
16
|
+
// The row seam: a RawRow (native accessor), NOT a *Obj. This is the de-box — no dynamic
|
|
17
|
+
// Value tree is walked; RawRow.Field is a direct native read.
|
|
18
|
+
lines.push(`\trow, ok := raw.(${PKG}.RawRow)`);
|
|
19
|
+
lines.push(`\tif !ok {`);
|
|
20
|
+
lines.push(`\t\treturn out, ${PKG}.NewExprFailure("TYPE_MISMATCH", "typed raw marshal ${d.name}: expected obj, got "+${PKG}.RawFieldType(raw))`);
|
|
21
|
+
lines.push(`\t}`);
|
|
22
|
+
for (const f of d.fields) {
|
|
23
|
+
const goName = goFieldName(f.name);
|
|
24
|
+
const keyLit = JSON.stringify(f.name);
|
|
25
|
+
lines.push(`\t{`);
|
|
26
|
+
lines.push(`\t\tfv, present := row.Field(${keyLit})`);
|
|
27
|
+
lines.push(`\t\tif !present {`);
|
|
28
|
+
lines.push(`\t\t\treturn out, ${PKG}.NewExprFailure("MISSING_PROP", "typed raw marshal ${d.name}: missing property ."+${keyLit})`);
|
|
29
|
+
lines.push(`\t\t}`);
|
|
30
|
+
lines.push(emitRawFieldMaterialize(`out.${goName}`, "fv", f.type, plan, 2));
|
|
31
|
+
lines.push(`\t}`);
|
|
32
|
+
}
|
|
33
|
+
lines.push(`\treturn out, nil`);
|
|
34
|
+
lines.push(`}`);
|
|
35
|
+
return lines.join("\n");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* emitRawFieldMaterialize — materialize `src` (a RawValue expr) into typed `target` per
|
|
39
|
+
* `ref`. scalar -> native type-switch on RawValue, named -> marshal_raw_T*, arr ->
|
|
40
|
+
* []RawValue loop, opt -> null branch. All concrete Go types; no *Obj/Value ever built.
|
|
41
|
+
*/
|
|
42
|
+
function emitRawFieldMaterialize(target, src, ref, plan, indent) {
|
|
43
|
+
const t = "\t".repeat(indent);
|
|
44
|
+
switch (ref.kind) {
|
|
45
|
+
case "scalar": {
|
|
46
|
+
if (ref.scalar === "null") {
|
|
47
|
+
// null-only field: store nil (the RawValue must be nil; mismatches are rare and the
|
|
48
|
+
// boxed path also passes through, so keep symmetric — a non-nil here is not asserted).
|
|
49
|
+
return `${t}${target} = nil`;
|
|
50
|
+
}
|
|
51
|
+
const gt = goScalar(ref.scalar);
|
|
52
|
+
const at = ref.scalar === "int" ? "int64" : ref.scalar === "float" ? "float64" : gt;
|
|
53
|
+
return [
|
|
54
|
+
`${t}sv, sok := ${src}.(${at})`,
|
|
55
|
+
`${t}if !sok {`,
|
|
56
|
+
`${t}\treturn out, ${PKG}.NewExprFailure("TYPE_MISMATCH", "typed raw marshal: expected ${ref.scalar}, got "+${PKG}.RawFieldType(${src}))`,
|
|
57
|
+
`${t}}`,
|
|
58
|
+
`${t}${target} = sv`,
|
|
59
|
+
].join("\n");
|
|
60
|
+
}
|
|
61
|
+
case "named": {
|
|
62
|
+
return [
|
|
63
|
+
`${t}mv, merr := marshal_raw_${ref.name}(${src})`,
|
|
64
|
+
`${t}if merr != nil {`,
|
|
65
|
+
`${t}\treturn out, merr`,
|
|
66
|
+
`${t}}`,
|
|
67
|
+
`${t}${target} = mv`,
|
|
68
|
+
].join("\n");
|
|
69
|
+
}
|
|
70
|
+
case "arr": {
|
|
71
|
+
const elemGo = renderTypeRef(ref.elem);
|
|
72
|
+
const inner = emitRawFieldMaterialize("elemOut", "elemRaw", ref.elem, plan, indent + 1);
|
|
73
|
+
return [
|
|
74
|
+
`${t}arr, aok := ${src}.([]${PKG}.RawValue)`,
|
|
75
|
+
`${t}if !aok {`,
|
|
76
|
+
`${t}\treturn out, ${PKG}.NewExprFailure("TYPE_MISMATCH", "typed raw marshal: expected arr, got "+${PKG}.RawFieldType(${src}))`,
|
|
77
|
+
`${t}}`,
|
|
78
|
+
`${t}slice := make([]${elemGo}, 0, len(arr))`,
|
|
79
|
+
`${t}for _, elemRaw := range arr {`,
|
|
80
|
+
`${t}\tvar elemOut ${elemGo}`,
|
|
81
|
+
inner,
|
|
82
|
+
`${t}\tslice = append(slice, elemOut)`,
|
|
83
|
+
`${t}}`,
|
|
84
|
+
`${t}${target} = slice`,
|
|
85
|
+
].join("\n");
|
|
86
|
+
}
|
|
87
|
+
case "opt": {
|
|
88
|
+
const innerGo = renderTypeRef(ref.inner);
|
|
89
|
+
const inner = emitRawFieldMaterialize("optOut", src, ref.inner, plan, indent + 1);
|
|
90
|
+
return [
|
|
91
|
+
`${t}if ${src} == nil {`,
|
|
92
|
+
`${t}\t${target} = nil`,
|
|
93
|
+
`${t}} else {`,
|
|
94
|
+
`${t}\tvar optOut ${innerGo}`,
|
|
95
|
+
inner,
|
|
96
|
+
`${t}\t${target} = &optOut`,
|
|
97
|
+
`${t}}`,
|
|
98
|
+
].join("\n");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Node materializer for scalar/arr/opt outType nodes on the raw path (fail-closed). */
|
|
103
|
+
function rawNodeMaterializerName(compName, nodeId) {
|
|
104
|
+
return `materializeRawNode_${sanitize(compName)}_${nodeId.replace(/[^A-Za-z0-9_]/g, "_")}`;
|
|
105
|
+
}
|
|
106
|
+
function emitRawNodeMaterializers(comp, typedNodes, plan) {
|
|
107
|
+
const parts = [];
|
|
108
|
+
for (const [id, ref] of typedNodes.entries()) {
|
|
109
|
+
if (ref.kind === "named")
|
|
110
|
+
continue;
|
|
111
|
+
const ty = renderTypeRef(ref);
|
|
112
|
+
const fn = rawNodeMaterializerName(comp.name, id);
|
|
113
|
+
const body = emitRawFieldMaterialize("out", "raw", ref, plan, 1);
|
|
114
|
+
parts.push(`func ${fn}(raw ${PKG}.RawValue) (${ty}, error) {\n\tvar out ${ty}\n${body}\n\treturn out, nil\n}`);
|
|
115
|
+
}
|
|
116
|
+
return parts.join("\n\n");
|
|
117
|
+
}
|
|
118
|
+
// ── RAW runner: RunPlan-driven struct-native exec through the RAW handler ─────────────
|
|
119
|
+
const PORT_SCOPE = "portScope()";
|
|
120
|
+
function emitRawStoreNode(nodeId, srcExpr, ref, compName, indent, producedName) {
|
|
121
|
+
const t = "\t".repeat(indent);
|
|
122
|
+
if (ref === undefined)
|
|
123
|
+
return `${t}_ = ${srcExpr}`;
|
|
124
|
+
const prod = `\n${t}${producedName(nodeId)} = true`;
|
|
125
|
+
const store = `${t}scopeMu.Lock()\n${t}${typedLocal(nodeId)} = tv${prod}\n${t}scopeMu.Unlock()`;
|
|
126
|
+
const call = ref.kind === "named" ? `marshal_raw_${ref.name}(${srcExpr})` : `${rawNodeMaterializerName(compName, nodeId)}(${srcExpr})`;
|
|
127
|
+
return `${t}tv, merr := ${call}\n${t}if merr != nil {\n${t}\treturn abort(idx, merr)\n${t}}\n${store}`;
|
|
128
|
+
}
|
|
129
|
+
function assertRawSupported(comp) {
|
|
130
|
+
for (const n of comp.body) {
|
|
131
|
+
if ("map" in n || "cond" in n) {
|
|
132
|
+
const ot = n.outType;
|
|
133
|
+
if (ot !== undefined) {
|
|
134
|
+
throw new GeneratorFailure("UNSUPPORTED_NODE_STRAIGHTLINE", `go raw ABI (bc#76): component '${comp.name}' node '${n.id}' is a typed ${"map" in n ? "map" : "cond"} node. The raw handler ABI de-box currently covers the componentRef read-handler shape (graphddb's row hydrator). Regenerate this component on the boxed typed path (go-typed) — do NOT emit a raw module that re-boxes map/cond results.`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function emitRawExecArm(op, compName, typedNodes, plan, producedName) {
|
|
140
|
+
if (op.kind !== "componentRef") {
|
|
141
|
+
// Guarded by assertRawSupported for typed nodes; an UNtyped map/cond in a typed
|
|
142
|
+
// component cannot reach here on the raw path (fail-closed at generation).
|
|
143
|
+
throw new GeneratorFailure("UNSUPPORTED_NODE_STRAIGHTLINE", `go raw ABI (bc#76): node '${op.id}' kind '${op.kind}' is not supported on the raw path (componentRef only). Regenerate on go-typed.`);
|
|
144
|
+
}
|
|
145
|
+
const gp = goPortVar;
|
|
146
|
+
const portEvals = op.ports
|
|
147
|
+
.map((p) => `\t\t\t${gp(p.name)}, err := ${p.expr}
|
|
148
|
+
\t\t\tif err != nil {
|
|
149
|
+
\t\t\t\treturn abort(idx, err)
|
|
150
|
+
\t\t\t}
|
|
151
|
+
\t\t\tports.Set(${JSON.stringify(p.name)}, ${gp(p.name)})`)
|
|
152
|
+
.join("\n");
|
|
153
|
+
const body = op.ports.length === 0 ? "" : `\n${portEvals}`;
|
|
154
|
+
const ref = typedNodes.get(op.id);
|
|
155
|
+
const materialize = emitRawStoreNode(op.id, "outcome.Ok", ref, compName, 3, producedName);
|
|
156
|
+
return `\t\tif i == ${op.index} {
|
|
157
|
+
\t\t\tports := ${PKG}.NewObj()${body}
|
|
158
|
+
\t\t\toutcome, resolved := ${PKG}.ExecRawHandler(handlers, ${JSON.stringify(op.id)}, ${JSON.stringify(op.component)}, ports, nil)
|
|
159
|
+
\t\t\tif !resolved {
|
|
160
|
+
\t\t\t\treturn abort(idx, ${PKG}.NewBehaviorFailure("UNKNOWN_COMPONENT", "component '${op.component}' has no handler (fail-closed)"))
|
|
161
|
+
\t\t\t}
|
|
162
|
+
\t\t\tif outcome.IsError {
|
|
163
|
+
\t\t\t\treturn ${PKG}.ErrOutcome(outcome.Err)
|
|
164
|
+
\t\t\t}
|
|
165
|
+
${materialize}
|
|
166
|
+
\t\t\treturn ${PKG}.OkOutcome(nil)
|
|
167
|
+
\t\t}`;
|
|
168
|
+
}
|
|
169
|
+
function emitRawRunner(comp, plan) {
|
|
170
|
+
assertRawSupported(comp);
|
|
171
|
+
const fn = sanitize(comp.name);
|
|
172
|
+
const cplan = buildComponentPlanForTyped(comp);
|
|
173
|
+
const typedNodes = collectTypedNodes(comp, plan);
|
|
174
|
+
const decls = [...typedNodes.entries()]
|
|
175
|
+
.map(([id, ref]) => `\tvar ${typedLocal(id)} ${renderTypeRef(ref)}`)
|
|
176
|
+
.join("\n");
|
|
177
|
+
const producedName = (id) => `__produced_${id.replace(/[^A-Za-z0-9_]/g, "_")}`;
|
|
178
|
+
const producedDecls = [...typedNodes.keys()]
|
|
179
|
+
.map((id) => `\t${producedName(id)} := false\n\t_ = ${producedName(id)}`)
|
|
180
|
+
.join("\n");
|
|
181
|
+
// #74: expose produced typed node results in the port scope by serializing the struct
|
|
182
|
+
// cells on demand (same discipline as the boxed typed runner — the struct is SoT).
|
|
183
|
+
const portScopeNodeInjections = [...typedNodes.entries()]
|
|
184
|
+
.map(([id, ref]) => {
|
|
185
|
+
const ser = serializeTyped(typedLocal(id), ref, plan);
|
|
186
|
+
return `\t\tif ${producedName(id)} {\n\t\t\ts.Set(${JSON.stringify(id)}, ${ser})\n\t\t}`;
|
|
187
|
+
})
|
|
188
|
+
.join("\n");
|
|
189
|
+
const arms = cplan.ops.map((op) => emitRawExecArm(op, comp.name, typedNodes, plan, producedName)).join("\n");
|
|
190
|
+
const planLiteral = comp.plan ? emitBehaviorPlanLiteral(comp.plan) : `(*${PKG}.ExecutionPlanSpec)(nil)`;
|
|
191
|
+
const outRef = comp.outputType !== undefined ? deriveTypeRef(comp.outputType, plan) : undefined;
|
|
192
|
+
const out = emitTypedValue(comp.output, outRef, typedNodes, plan);
|
|
193
|
+
const outRefFinal = out.ref ?? outRef;
|
|
194
|
+
const serialized = outRefFinal ? serializeTyped("__typed_out", outRefFinal, plan) : "__typed_out";
|
|
195
|
+
return `// run_typed_raw_${fn} — RAW-ABI STRUCT-NATIVE exec (bc#76 de-box): the RunPlan primitive drives the
|
|
196
|
+
// plan (plan SSoT); per-node arms call the RAW handler (ExecRawHandler -> RawValue, NOT a boxed Value)
|
|
197
|
+
// and materialize the node's outType struct DIRECTLY from the RawValue via marshal_raw_T*. The dynamic
|
|
198
|
+
// Value/*Obj tree is NEVER built on the row data plane — that is the de-box the boxed typed path only
|
|
199
|
+
// LAYERED. The output is assembled as a struct and serialized to a Value ONLY at the final return
|
|
200
|
+
// boundary (the equivalence pin), so the OBSERVED result equals run_behavior. Called by BindRaw.
|
|
201
|
+
func run_typed_raw_${fn}(handlers ${PKG}.RawComponentExec, input *${PKG}.Obj) (${PKG}.Value, error) {
|
|
202
|
+
\tops := ${emitOpsLiteral(cplan)}
|
|
203
|
+
\tif input == nil {
|
|
204
|
+
\t\tinput = ${PKG}.NewObj()
|
|
205
|
+
\t}
|
|
206
|
+
${decls ? decls + "\n" : ""}${producedDecls ? producedDecls + "\n" : ""}\tvar scopeMu sync.Mutex
|
|
207
|
+
\t_ = scopeMu.Unlock
|
|
208
|
+
\tportScope := func() *${PKG}.Obj {
|
|
209
|
+
\t\ts := ${PKG}.NewObj()
|
|
210
|
+
\t\tfor _, k := range input.Keys {
|
|
211
|
+
\t\t\ts.Set(k, input.Vals[k])
|
|
212
|
+
\t\t}
|
|
213
|
+
${portScopeNodeInjections ? "\t\tscopeMu.Lock()\n" + portScopeNodeInjections + "\n\t\tscopeMu.Unlock()\n" : ""}\t\treturn s
|
|
214
|
+
\t}
|
|
215
|
+
\t_ = portScope
|
|
216
|
+
\texecErrs := make([]error, len(ops))
|
|
217
|
+
\tabort := func(idx int, err error) ${PKG}.ExecOutcome {
|
|
218
|
+
\t\texecErrs[idx] = err
|
|
219
|
+
\t\treturn ${PKG}.ErrOutcome("aborted")
|
|
220
|
+
\t}
|
|
221
|
+
\texec := func(op ${PKG}.OpSpec, _ ${PKG}.Value) ${PKG}.ExecOutcome {
|
|
222
|
+
\t\tidx := -1
|
|
223
|
+
\t\tfor k := range ops {
|
|
224
|
+
\t\t\tif ops[k].ID == op.ID {
|
|
225
|
+
\t\t\t\tidx = k
|
|
226
|
+
\t\t\t\tbreak
|
|
227
|
+
\t\t\t}
|
|
228
|
+
\t\t}
|
|
229
|
+
\t\ti := idx
|
|
230
|
+
${arms}
|
|
231
|
+
\t\treturn abort(idx, ${PKG}.NewBehaviorFailure("UNKNOWN_NODE_KIND", "op '"+op.ID+"' has no generated raw exec arm (fail-closed)"))
|
|
232
|
+
\t}
|
|
233
|
+
\tplan := ${planLiteral}
|
|
234
|
+
\trun, err := ${PKG}.RunPlan(plan, ops, exec)
|
|
235
|
+
\tif firstErr := ${PKG}.FirstExecErrInVisitOrder(execErrs, plan, len(ops), err); firstErr != nil {
|
|
236
|
+
\t\treturn nil, firstErr
|
|
237
|
+
\t}
|
|
238
|
+
\tif err != nil {
|
|
239
|
+
\t\treturn nil, err
|
|
240
|
+
\t}
|
|
241
|
+
\t_ = run
|
|
242
|
+
\t__typed_out := ${out.expr}
|
|
243
|
+
\t_ = __typed_out
|
|
244
|
+
\treturn ${serialized}, nil
|
|
245
|
+
}`;
|
|
246
|
+
}
|
|
247
|
+
// ── BindRaw dispatch surface ──────────────────────────────────────────────────────────
|
|
248
|
+
function emitBindRaw(ctx) {
|
|
249
|
+
const arms = ctx.ir.components
|
|
250
|
+
.filter((c) => isTypedComponent(c))
|
|
251
|
+
.map((c) => {
|
|
252
|
+
const fn = sanitize(c.name);
|
|
253
|
+
return `\tm[${JSON.stringify(c.name)}] = func(input *${PKG}.Obj) (${PKG}.Value, error) {\n\t\treturn run_typed_raw_${fn}(handlers, input)\n\t}`;
|
|
254
|
+
})
|
|
255
|
+
.join("\n");
|
|
256
|
+
return `// BindRaw is the RAW-ABI dispatch surface (bc#76): it binds a RawComponentExec (native-backed
|
|
257
|
+
// handler results) to the de-boxed struct-native runners. Only typed components are exposed on the raw
|
|
258
|
+
// path; a consumer keeps untyped components on the boxed Bind. This mirrors Bind but drives the raw runner.
|
|
259
|
+
func BindRaw(handlers ${PKG}.RawComponentExec) map[string]func(*${PKG}.Obj) (${PKG}.Value, error) {
|
|
260
|
+
\tm := map[string]func(*${PKG}.Obj) (${PKG}.Value, error){}
|
|
261
|
+
${arms}
|
|
262
|
+
\treturn m
|
|
263
|
+
}`;
|
|
264
|
+
}
|
|
265
|
+
// ── module assembly ──────────────────────────────────────────────────────────────────
|
|
266
|
+
function emit(ctx) {
|
|
267
|
+
const typed = hasAnyTypeAnnotation(ctx);
|
|
268
|
+
if (!typed) {
|
|
269
|
+
throw new GeneratorFailure("UNSUPPORTED_NODE_STRAIGHTLINE", "go raw ABI (bc#76): the IR has no outType/outputType annotations — there is nothing to de-box. Use go-straightline for untyped IR.");
|
|
270
|
+
}
|
|
271
|
+
// Reuse the straight-line body so port evaluation helpers (slRef/slConcat/slPart) and the
|
|
272
|
+
// RunPlan primitive helpers are present (raw runner reuses them; ports are Value-space).
|
|
273
|
+
setGoForceRunPlanHelpers(true);
|
|
274
|
+
const straightlineCode = goStraightlineEmitter.emit(ctx);
|
|
275
|
+
setGoForceRunPlanHelpers(false);
|
|
276
|
+
const plan = buildTypePlan(ctx.ir);
|
|
277
|
+
const decls = emitTypeDecls(plan);
|
|
278
|
+
const rawMarshallers = emitRawMarshallers(plan);
|
|
279
|
+
const serializers = emitSerializers(plan);
|
|
280
|
+
// Boxed marshallers exist ONLY for the Value-space output-assembly fallback (mustMarshal_*),
|
|
281
|
+
// reached only when a component output directly references an INPUT PARAM of a named type — a
|
|
282
|
+
// Value-space boundary read, NOT the row data plane. The ROW data plane (handler result ->
|
|
283
|
+
// struct) is de-boxed via marshal_raw_* in the runner (asserted by the anti-sham gate).
|
|
284
|
+
const boxedMarshallers = emitMarshallers(plan);
|
|
285
|
+
const mustHelpers = goTypedInternals.emitMustHelpers(plan);
|
|
286
|
+
const arrOptNodeHelpers = goTypedInternals.emitArrOptNodeHelpers(ctx, plan);
|
|
287
|
+
const nodeMaterializers = ctx.ir.components
|
|
288
|
+
.filter((c) => isTypedComponent(c))
|
|
289
|
+
.map((c) => {
|
|
290
|
+
const typedNodes = new Map();
|
|
291
|
+
for (const n of c.body) {
|
|
292
|
+
if ("map" in n)
|
|
293
|
+
continue;
|
|
294
|
+
const ot = n.outType;
|
|
295
|
+
if (ot !== undefined)
|
|
296
|
+
typedNodes.set(n.id, deriveTypeRef(ot, plan));
|
|
297
|
+
}
|
|
298
|
+
return emitRawNodeMaterializers(c, typedNodes, plan);
|
|
299
|
+
})
|
|
300
|
+
.filter((s) => s.length > 0)
|
|
301
|
+
.join("\n\n");
|
|
302
|
+
const runners = ctx.ir.components
|
|
303
|
+
.filter((c) => isTypedComponent(c))
|
|
304
|
+
.map((c) => emitRawRunner(c, plan))
|
|
305
|
+
.join("\n\n");
|
|
306
|
+
const bindRaw = emitBindRaw(ctx);
|
|
307
|
+
const banner = `// ── RAW handler ABI layer (bc#76 — Go de-box: struct materialized DIRECTLY from the wire payload) ──
|
|
308
|
+
// This layer is ADDITIVE to the straight-line body above. A RawComponentExec handler returns a
|
|
309
|
+
// RawValue (native-backed, NOT a *Obj/Value tree — see go/rawabi.go). marshal_raw_T* reads it via
|
|
310
|
+
// RawRow.Field / native scalar type-switch straight into the concrete struct: the dynamic Value tree
|
|
311
|
+
// the boxed typed path built and then re-walked NEVER exists here. BindRaw drives the de-boxed runners.`;
|
|
312
|
+
const sections = [
|
|
313
|
+
banner,
|
|
314
|
+
decls || undefined,
|
|
315
|
+
rawMarshallers
|
|
316
|
+
? `// RAW marshallers (§4.4, de-box): materialize a concrete struct field-by-field from a native RawValue.\n// NO *Obj/NewObj/PrimObj on this data plane — that is the whole point of #76.\n${rawMarshallers}`
|
|
317
|
+
: undefined,
|
|
318
|
+
boxedMarshallers
|
|
319
|
+
? `// Value-space output-assembly fallback (mustMarshal_*): reached ONLY when an output directly refs an\n// input param of a named type (a Value boundary read, not the row data plane). Off the de-box hot path.\n${boxedMarshallers}`
|
|
320
|
+
: undefined,
|
|
321
|
+
`// typed -> Value serializers (final return boundary only): canonical observation for the equivalence pin.\n${serializers}`,
|
|
322
|
+
`// must-form helpers reused for the output assembly (Value-space, off the row data plane).\n${mustHelpers}`,
|
|
323
|
+
arrOptNodeHelpers ? `// arr/opt node de-box helpers (Value-space output assembly).\n${arrOptNodeHelpers}` : undefined,
|
|
324
|
+
nodeMaterializers
|
|
325
|
+
? `// scalar/arr/opt node RAW materializers: FAIL-CLOSED de-box (TYPE_MISMATCH/MISSING_PROP) from RawValue.\n${nodeMaterializers}`
|
|
326
|
+
: undefined,
|
|
327
|
+
`// RAW-ABI struct-native runners: the REAL de-box exec path (called by BindRaw).\n${runners}`,
|
|
328
|
+
bindRaw,
|
|
329
|
+
];
|
|
330
|
+
const typedBody = sections.filter((s) => !!s).join("\n\n");
|
|
331
|
+
return `${straightlineCode.replace(/\n+$/, "\n")}\n${typedBody}\n`;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* goRawAbiEmitter — language id `go-typed-raw` (bc#76). Emits the straight-line body (for
|
|
335
|
+
* untyped components / helpers) plus the RAW-ABI de-boxed layer (struct materialized directly
|
|
336
|
+
* from RawValue) and the BindRaw surface. Requires at least one outType/outputType annotation.
|
|
337
|
+
*/
|
|
338
|
+
export const goRawAbiEmitter = {
|
|
339
|
+
language: "go-typed-raw",
|
|
340
|
+
fileExtension: ".go",
|
|
341
|
+
defaultRuntimeImport: "github.com/foo-ogawa/behavior-contracts/go",
|
|
342
|
+
filenameHint: "behaviors.typed.raw.generated.go",
|
|
343
|
+
emit,
|
|
344
|
+
};
|
|
345
|
+
//# sourceMappingURL=emit-raw-abi-go.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-raw-abi-go.js","sourceRoot":"","sources":["../../src/generator/emit-raw-abi-go.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* emit-raw-abi-rust.ts — Rust RAW handler ABI emitter (bc#76): the de-boxed typed path.
|
|
3
|
+
*
|
|
4
|
+
* # What this replaces
|
|
5
|
+
*
|
|
6
|
+
* The boxed typed emitter (emit-straightline-typed-rust.ts) generates
|
|
7
|
+
* `marshal_T*(raw: &Value) -> Result<T*, BehaviorError>`: the handler builds a full dynamic
|
|
8
|
+
* `Value::Obj` tree and the marshaller WALKS it into a struct — a Value->struct conversion
|
|
9
|
+
* LAYERED on top of boxing. Rust felt the residual ~22% gap #75 measured most: the `Value`
|
|
10
|
+
* enum heap-boxes every `Obj` pair into `Vec<(String, Value)>`, cloned at the ABI, re-walked.
|
|
11
|
+
*
|
|
12
|
+
* # What this emits
|
|
13
|
+
*
|
|
14
|
+
* A RAW module that materializes structs DIRECTLY from a `RawValue` (native-backed, NOT a
|
|
15
|
+
* `Value` — see rust/src/rawabi.rs). The generated code:
|
|
16
|
+
*
|
|
17
|
+
* - `marshal_raw_T*(raw: &RawValue) -> Result<T*, BehaviorError>`: matches on RawValue
|
|
18
|
+
* (scalar / RawRow / Arr) straight into the concrete struct. It NEVER constructs a
|
|
19
|
+
* `Value::Obj`/`Value` on the row data plane.
|
|
20
|
+
* - `run_typed_raw_<comp><H: RawComponentExec>(handlers, input) -> Result<Value, ...>`:
|
|
21
|
+
* drives the plan with the run_plan primitive (plan SSoT, reused), evaluates ports with
|
|
22
|
+
* the native/primitive straight-line expressions (unchanged — ports are Value-space, off
|
|
23
|
+
* the row data plane), calls the RAW handler (`exec_raw_ctx` -> `RawValue`), and
|
|
24
|
+
* materializes the node struct via `marshal_raw_T*` at the boundary. The output is
|
|
25
|
+
* assembled as a struct and serialized to a Value ONLY at the final return boundary (the
|
|
26
|
+
* equivalence pin), exactly as the boxed typed path — so the OBSERVED result equals
|
|
27
|
+
* run_behavior while the row data plane never boxed.
|
|
28
|
+
* - `bind_raw<H: RawComponentExec>(handlers) -> BoundRaw<H>` + `BoundRaw::call`: the raw
|
|
29
|
+
* dispatch surface (mirrors bind/Bound::call). `COMPONENT_NAMES_RAW` lists the typed
|
|
30
|
+
* components exposed on the raw path.
|
|
31
|
+
*
|
|
32
|
+
* # Scope
|
|
33
|
+
*
|
|
34
|
+
* The raw de-box covers the componentRef read-handler shape (graphddb's row hydrator). Typed
|
|
35
|
+
* map/cond nodes LOUD-fail (UNSUPPORTED_NODE_STRAIGHTLINE) so a consumer regenerates those on
|
|
36
|
+
* the boxed typed path rather than getting a module that silently re-boxes.
|
|
37
|
+
*/
|
|
38
|
+
import type { EmitterPlugin } from "./core.js";
|
|
39
|
+
/**
|
|
40
|
+
* rustRawAbiEmitter — language id `rust-typed-raw` (bc#76). Emits the straight-line body (for
|
|
41
|
+
* untyped components / helpers) plus the RAW-ABI de-boxed layer (struct materialized directly from
|
|
42
|
+
* RawValue) and the bind_raw surface. Requires at least one outType/outputType annotation.
|
|
43
|
+
*/
|
|
44
|
+
export declare const rustRawAbiEmitter: EmitterPlugin;
|
|
45
|
+
//# sourceMappingURL=emit-raw-abi-rust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-raw-abi-rust.d.ts","sourceRoot":"","sources":["../../src/generator/emit-raw-abi-rust.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,WAAW,CAAC;AA8a5D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAM/B,CAAC"}
|