behavior-contracts 0.2.0 → 0.2.2

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 (67) hide show
  1. package/dist/behavior.d.ts +47 -0
  2. package/dist/behavior.d.ts.map +1 -1
  3. package/dist/behavior.js.map +1 -1
  4. package/dist/generator/core.d.ts +1 -1
  5. package/dist/generator/core.d.ts.map +1 -1
  6. package/dist/generator/core.js.map +1 -1
  7. package/dist/generator/emit-straightline-go.d.ts +77 -0
  8. package/dist/generator/emit-straightline-go.d.ts.map +1 -0
  9. package/dist/generator/emit-straightline-go.js +592 -0
  10. package/dist/generator/emit-straightline-go.js.map +1 -0
  11. package/dist/generator/emit-straightline-php.d.ts +46 -0
  12. package/dist/generator/emit-straightline-php.d.ts.map +1 -0
  13. package/dist/generator/emit-straightline-php.js +501 -0
  14. package/dist/generator/emit-straightline-php.js.map +1 -0
  15. package/dist/generator/emit-straightline-python.d.ts +36 -0
  16. package/dist/generator/emit-straightline-python.d.ts.map +1 -0
  17. package/dist/generator/emit-straightline-python.js +441 -0
  18. package/dist/generator/emit-straightline-python.js.map +1 -0
  19. package/dist/generator/emit-straightline-rust.d.ts +78 -0
  20. package/dist/generator/emit-straightline-rust.d.ts.map +1 -0
  21. package/dist/generator/emit-straightline-rust.js +615 -0
  22. package/dist/generator/emit-straightline-rust.js.map +1 -0
  23. package/dist/generator/emit-straightline-typed-go.d.ts +39 -0
  24. package/dist/generator/emit-straightline-typed-go.d.ts.map +1 -0
  25. package/dist/generator/emit-straightline-typed-go.js +828 -0
  26. package/dist/generator/emit-straightline-typed-go.js.map +1 -0
  27. package/dist/generator/emit-straightline-typed-rust.d.ts +48 -0
  28. package/dist/generator/emit-straightline-typed-rust.d.ts.map +1 -0
  29. package/dist/generator/emit-straightline-typed-rust.js +823 -0
  30. package/dist/generator/emit-straightline-typed-rust.js.map +1 -0
  31. package/dist/generator/emit-straightline-typed-typescript.d.ts +49 -0
  32. package/dist/generator/emit-straightline-typed-typescript.d.ts.map +1 -0
  33. package/dist/generator/emit-straightline-typed-typescript.js +314 -0
  34. package/dist/generator/emit-straightline-typed-typescript.js.map +1 -0
  35. package/dist/generator/emit-straightline-typescript.d.ts +36 -0
  36. package/dist/generator/emit-straightline-typescript.d.ts.map +1 -0
  37. package/dist/generator/emit-straightline-typescript.js +397 -0
  38. package/dist/generator/emit-straightline-typescript.js.map +1 -0
  39. package/dist/generator/index.d.ts +13 -0
  40. package/dist/generator/index.d.ts.map +1 -1
  41. package/dist/generator/index.js +39 -0
  42. package/dist/generator/index.js.map +1 -1
  43. package/dist/generator/literal.d.ts +7 -0
  44. package/dist/generator/literal.d.ts.map +1 -1
  45. package/dist/generator/literal.js +41 -0
  46. package/dist/generator/literal.js.map +1 -1
  47. package/dist/generator/straightline.d.ts +147 -0
  48. package/dist/generator/straightline.d.ts.map +1 -0
  49. package/dist/generator/straightline.js +122 -0
  50. package/dist/generator/straightline.js.map +1 -0
  51. package/dist/generator/typed.d.ts +156 -0
  52. package/dist/generator/typed.d.ts.map +1 -0
  53. package/dist/generator/typed.js +108 -0
  54. package/dist/generator/typed.js.map +1 -0
  55. package/dist/guard.d.ts +18 -0
  56. package/dist/guard.d.ts.map +1 -1
  57. package/dist/guard.js +56 -0
  58. package/dist/guard.js.map +1 -1
  59. package/dist/index.d.ts +7 -4
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +10 -2
  62. package/dist/index.js.map +1 -1
  63. package/dist/primitives.d.ts +112 -0
  64. package/dist/primitives.d.ts.map +1 -0
  65. package/dist/primitives.js +206 -0
  66. package/dist/primitives.js.map +1 -0
  67. package/package.json +1 -1
@@ -0,0 +1,615 @@
1
+ import { emitDocLiteral, emitDocLiteralCompact } from "./literal.js";
2
+ import { emitStraightlineModule, } from "./straightline.js";
3
+ /** primitive namespace(生成コード内)。crate から `primitives` を use する。 */
4
+ const P = "primitives";
5
+ /**
6
+ * scope 変数(生成コード内)。scope は「input + それまでの ok 結果」のその時点のスナップで
7
+ * あり、run_behavior の base_scope と同じく exec ごとに新規に組む。primitive へは `&scope()`
8
+ * (呼び時点の results を読む — 決定的)を渡す。
9
+ */
10
+ const SCOPE = "scope()";
11
+ /**
12
+ * map 本体(over/guard/ports)の要素 scope 式(生成コード内)。run_behavior の map と同じく
13
+ * base_scope に `as`→要素値 を足したスナップ。生成コードは map arm 内で per-element に
14
+ * `mscope()`(Vec<(String, Value)> を返すクロージャ)をローカル定義し、port/guard 式はそれを呼ぶ。
15
+ */
16
+ const MAP_SCOPE = "mscope()";
17
+ /** IR リテラルを rust の `json!(...)` 引数(単一行)へ落とす(未評価 Expr 被演算子用)。 */
18
+ function jsonLit(node) {
19
+ return `json!(${emitDocLiteralCompact(node, "rust")})`;
20
+ }
21
+ /** args 配列(二項/単項 op の被演算子)を `&json!(a), &json!(b)` の形へ。 */
22
+ function argRefs(arg) {
23
+ return arg.map((a) => `&${jsonLit(a)}`).join(", ");
24
+ }
25
+ /** ref/refOpt の path がすべて string リテラルか(native 化の条件)。 */
26
+ function isStaticStringPath(arg) {
27
+ return Array.isArray(arg) && arg.length > 0 && arg.every((p) => typeof p === "string");
28
+ }
29
+ /** string を rust 文字列リテラルへ(path セグメント用。JSON エスケープで安全側)。 */
30
+ function rustStrLit(s) {
31
+ return JSON.stringify(s);
32
+ }
33
+ /**
34
+ * emitExpr — Expression IR ノードを rust の「scope を受けて `R`(= Result<Value, ExprFailure>)を
35
+ * 返す」式へ落とす。**単純式はネイティブ化**(式ツリー解釈 `evaluate` を消す — bc#39 AC#2 の
36
+ * 脱解釈の実体)、overflow/短絡系のみ A0 primitive SSoT を直呼びする:
37
+ *
38
+ * - `concat` → `primitives::concat_native(&[<part>?, …])`(native 連結。`evaluate` 非経由)
39
+ * - `ref`/`refOpt`(静的 path)→ `primitives::ref_native(&["a","b"], scope)` 等(native scope walk)
40
+ * - それ以外の演算子 → 対応する A0 evaluate 委譲 primitive(被演算子は未評価 IR リテラル)
41
+ * - スカラ/ null / bool リテラルや非静的 path・未知形 → `primitives::eval_expr(&json!(..), scope)`
42
+ * (同一 SSoT。型判定を生成コードに残さない)
43
+ *
44
+ * Portability Guard を通過済み(生成時検査)なので未知 operator はここに来ない。
45
+ * 返り値は必ず `R` 型の rust 式(呼び側が `?` で Value へ展開する)。
46
+ */
47
+ function emitExpr(node, scopeVar) {
48
+ if (node !== null && typeof node === "object" && !Array.isArray(node)) {
49
+ const keys = Object.keys(node);
50
+ if (keys.length === 1) {
51
+ const op = keys[0];
52
+ const arg = node[op];
53
+ // ── (1) ネイティブ化: concat(式ツリー解釈を消す)───────────────────────────
54
+ if (op === "concat" && Array.isArray(arg)) {
55
+ // 各 part を再帰的に native emit → `?` で Value 化 → concat_native が push_str 連結。
56
+ const parts = arg.map((a) => `(${emitExpr(a, scopeVar)})?`).join(", ");
57
+ return `${P}::concat_native(&[${parts}])`;
58
+ }
59
+ // ── (2) ネイティブ化: ref / refOpt(静的 string path のみ scope walk へ)────────
60
+ if ((op === "ref" || op === "refOpt") && isStaticStringPath(arg)) {
61
+ const path = arg.map(rustStrLit).join(", ");
62
+ const fn = op === "ref" ? "ref_native" : "ref_opt_native";
63
+ return `${P}::${fn}(&[${path}], &${scopeVar})`;
64
+ }
65
+ // ── (3) SSoT: overflow/短絡系ほか — A0 evaluate 委譲 primitive を直呼び ─────────
66
+ const call = OP_PRIMITIVE[op];
67
+ if (call)
68
+ return call(arg, scopeVar);
69
+ }
70
+ }
71
+ // スカラリテラル / 非静的 path / 未知形 — evaluate SSoT に委譲(同一意味論)。
72
+ return `${P}::eval_expr(&${jsonLit(node)}, &${scopeVar})`;
73
+ }
74
+ const OP_PRIMITIVE = {
75
+ // 参照(動的 path — 静的 path は上で native 化済み)。
76
+ ref: (a, s) => `${P}::eval_expr(&${jsonLit({ ref: a })}, &${s})`,
77
+ refOpt: (a, s) => `${P}::eval_expr(&${jsonLit({ refOpt: a })}, &${s})`,
78
+ // リテラルラッパ(int は string, float は number)。
79
+ int: (a, s) => `${P}::int_lit(${rustStrLit(a)}, &${s})`,
80
+ float: (a, s) => `${P}::float_lit(${String(a)}, &${s})`,
81
+ // 構築(fields/elements は未評価 IR)。
82
+ obj: (a, s) => `${P}::obj(&${jsonLit(a)}, &${s})`,
83
+ arr: (a, s) => `${P}::arr(&[${a.map((e) => jsonLit(e)).join(", ")}], &${s})`,
84
+ // 数値(二項は [a,b]・単項は [a])。fail-closed 意味論のため SSoT primitive。
85
+ add: (a, s) => `${P}::add(${argRefs(a)}, &${s})`,
86
+ sub: (a, s) => `${P}::sub(${argRefs(a)}, &${s})`,
87
+ mul: (a, s) => `${P}::mul(${argRefs(a)}, &${s})`,
88
+ neg: (a, s) => `${P}::neg(${argRefs(a)}, &${s})`,
89
+ div: (a, s) => `${P}::div(${argRefs(a)}, &${s})`,
90
+ mod: (a, s) => `${P}::r#mod(${argRefs(a)}, &${s})`,
91
+ // 比較(二項)。
92
+ eq: (a, s) => `${P}::eq(${argRefs(a)}, &${s})`,
93
+ ne: (a, s) => `${P}::ne(${argRefs(a)}, &${s})`,
94
+ lt: (a, s) => `${P}::lt(${argRefs(a)}, &${s})`,
95
+ le: (a, s) => `${P}::le(${argRefs(a)}, &${s})`,
96
+ gt: (a, s) => `${P}::gt(${argRefs(a)}, &${s})`,
97
+ ge: (a, s) => `${P}::ge(${argRefs(a)}, &${s})`,
98
+ // bool/null(短絡: 被演算子は未評価 IR で渡す — primitive 内 evaluate が短絡)。
99
+ and: (a, s) => `${P}::and(${argRefs(a)}, &${s})`,
100
+ or: (a, s) => `${P}::or(${argRefs(a)}, &${s})`,
101
+ not: (a, s) => `${P}::not(${argRefs(a)}, &${s})`,
102
+ coalesce: (a, s) => `${P}::coalesce(${argRefs(a)}, &${s})`,
103
+ cond: (a, s) => {
104
+ const [c, t, e] = a;
105
+ return `${P}::cond(&${jsonLit(c)}, &${jsonLit(t)}, &${jsonLit(e)}, &${s})`;
106
+ },
107
+ len: (a, s) => `${P}::len(${argRefs(a)}, &${s})`,
108
+ };
109
+ // ── per-node exec 分岐 / component 関数 / module の綴じ方 ──────────────────────
110
+ /** component 名 → rust 関数名の一部(決定的・一意は DUPLICATE_COMPONENT で保証)。 */
111
+ function sanitize(name) {
112
+ return name.replace(/[^A-Za-z0-9_]/g, "_");
113
+ }
114
+ /** ops リテラル(run_plan に渡す OpSpec の Vec を綴じる rust コード)。 */
115
+ function emitOpsLiteral(plan) {
116
+ const rows = plan.opsLiteral.map((o) => {
117
+ const parent = o.parent === null ? "None" : `Some(${o.parent})`;
118
+ const bindField = o.bindField === undefined ? "None" : `Some(${rustStrLit(o.bindField)}.to_string())`;
119
+ const relationKind = o.relationKind === undefined
120
+ ? "None"
121
+ : `Some(RelationKind::${o.relationKind === "connection" ? "Connection" : "Single"})`;
122
+ const policy = o.policy === undefined ? "None" : `Some(${rustStrLit(o.policy)}.to_string())`;
123
+ return ` OpSpec {
124
+ id: ${rustStrLit(o.id)}.to_string(),
125
+ parent: ${parent},
126
+ bind_field: ${bindField},
127
+ relation_kind: ${relationKind},
128
+ policy: ${policy},
129
+ },`;
130
+ });
131
+ return `vec![\n${rows.join("\n")}\n ]`;
132
+ }
133
+ /** map arm の要素 ports 構築式(要素 scope `mscope()` で各 port を native/primitive 評価)。 */
134
+ function emitMapPortsRust(op) {
135
+ if (op.ports.length === 0)
136
+ return "Ok(Vec::new())";
137
+ return `Ok(vec![\n${op.ports
138
+ .map((pt) => ` (${rustStrLit(pt.name)}.to_string(), (${pt.expr})?),`)
139
+ .join("\n")}\n ])`;
140
+ }
141
+ /**
142
+ * emitMapArm — map ノードの直線展開(要素反復・guard skip・per-element/batched handler・into
143
+ * zip-attach)。run_behavior の map 分岐(behavior.rs)を生成 rust へ直線展開する。op-log 等価のため
144
+ * exec_ctx は run_behavior と同じ ctx(非 batched は bound=Some(要素)、batched は None)・同じ ports で
145
+ * 呼ぶ。guard は cond primitive(strict-bool SSoT)、into は inline zip-attach
146
+ * (MAP_INTO_ELEMENT_NOT_OBJECT fail-closed で Failure code 一致)。要素反復は宣言どおり逐次
147
+ * (run_behavior が sequential run_plan を使うのと同一 — 経路等価の pin 対象)。
148
+ */
149
+ function emitMapArm(op) {
150
+ const comp = rustStrLit(op.component);
151
+ const nodeId = rustStrLit(op.id);
152
+ const asKey = rustStrLit(op.as);
153
+ const guardBlock = op.guard === undefined
154
+ ? ""
155
+ : `
156
+ let gkeep = {
157
+ let mscope = || -> Vec<(String, Value)> {
158
+ let mut s = ${SCOPE};
159
+ s.push((${asKey}.to_string(), el.clone()));
160
+ s
161
+ };
162
+ let _ = &mscope;
163
+ match ${op.guard} {
164
+ Ok(v) => matches!(v, Value::Bool(true)),
165
+ Err(e) => {
166
+ *err_cell = Some(e.into());
167
+ return ExecOutcome::Error("aborted".to_string());
168
+ }
169
+ }
170
+ };
171
+ if !gkeep {
172
+ continue;
173
+ }`;
174
+ const portEval = `
175
+ let eval_ports = || -> Result<Vec<(String, Value)>, behavior_contracts::ExprFailure> {
176
+ let mscope = || -> Vec<(String, Value)> {
177
+ let mut s = ${SCOPE};
178
+ s.push((${asKey}.to_string(), el.clone()));
179
+ s
180
+ };
181
+ let _ = &mscope;
182
+ ${emitMapPortsRust(op)}
183
+ };
184
+ let ports = match eval_ports() {
185
+ Ok(p) => p,
186
+ Err(e) => {
187
+ *err_cell = Some(e.into());
188
+ return ExecOutcome::Error("aborted".to_string());
189
+ }
190
+ };`;
191
+ const intoTail = op.into === undefined
192
+ ? ` results_cell.push((op.id.clone(), Value::Arr(collected.clone())));
193
+ return ExecOutcome::Ok(Value::Arr(collected));`
194
+ : ` let mut augmented: Vec<Value> = Vec::with_capacity(over_arr.len());
195
+ let mut mk = 0usize;
196
+ for (mj, oel) in over_arr.iter().enumerate() {
197
+ if mk < kept_idx.len() && kept_idx[mk] == mj {
198
+ match oel {
199
+ Value::Obj(pairs) => {
200
+ let mut next: Vec<(String, Value)> = pairs.clone();
201
+ if let Some(slot) = next.iter_mut().find(|(kk, _)| kk == ${rustStrLit(op.into)}) {
202
+ slot.1 = collected[mk].clone();
203
+ } else {
204
+ next.push((${rustStrLit(op.into)}.to_string(), collected[mk].clone()));
205
+ }
206
+ augmented.push(Value::Obj(next));
207
+ }
208
+ _ => {
209
+ *err_cell = Some(behavior_contracts::BehaviorError::new(
210
+ "MAP_INTO_ELEMENT_NOT_OBJECT",
211
+ format!("map '${op.id}': 'into' requires object elements (element {mj} is not an object)"),
212
+ ));
213
+ return ExecOutcome::Error("aborted".to_string());
214
+ }
215
+ }
216
+ mk += 1;
217
+ } else {
218
+ augmented.push(oel.clone());
219
+ }
220
+ }
221
+ results_cell.push((op.id.clone(), Value::Arr(augmented.clone())));
222
+ return ExecOutcome::Ok(Value::Arr(augmented));`;
223
+ const loopBody = op.batched
224
+ ? ` let mut items: Vec<Value> = Vec::new();
225
+ for (mi, el) in over_arr.iter().enumerate() {${guardBlock}${portEval}
226
+ items.push(Value::Obj(ports));
227
+ kept_idx.push(mi);
228
+ }
229
+ let collected: Vec<Value> = if items.is_empty() {
230
+ Vec::new()
231
+ } else {
232
+ let want = items.len();
233
+ let batch_ports = vec![("items".to_string(), Value::Arr(items))];
234
+ match handlers.exec_ctx(${nodeId}, ${comp}, &batch_ports, None) {
235
+ None => {
236
+ *err_cell = Some(unknown_component(${comp}));
237
+ return ExecOutcome::Error("aborted".to_string());
238
+ }
239
+ Some(ExecOutcome::Error(e)) => return ExecOutcome::Error(e),
240
+ Some(ExecOutcome::Ok(v)) => match v {
241
+ Value::Arr(r) if r.len() == want => r,
242
+ _ => {
243
+ *err_cell = Some(behavior_contracts::BehaviorError::new(
244
+ "MAP_BATCH_RESULT_MISMATCH",
245
+ format!("map '${op.id}': batched handler must return a list aligned to items (want {want})"),
246
+ ));
247
+ return ExecOutcome::Error("aborted".to_string());
248
+ }
249
+ },
250
+ }
251
+ };
252
+ ${intoTail}`
253
+ : ` let mut collected: Vec<Value> = Vec::with_capacity(over_arr.len());
254
+ for (mi, el) in over_arr.iter().enumerate() {${guardBlock}${portEval}
255
+ match handlers.exec_ctx(${nodeId}, ${comp}, &ports, Some(el)) {
256
+ None => {
257
+ *err_cell = Some(unknown_component(${comp}));
258
+ return ExecOutcome::Error("aborted".to_string());
259
+ }
260
+ Some(ExecOutcome::Error(e)) => return ExecOutcome::Error(e),
261
+ Some(ExecOutcome::Ok(v)) => collected.push(v),
262
+ }
263
+ kept_idx.push(mi);
264
+ }
265
+ ${intoTail}`;
266
+ return ` if i == ${op.index} {
267
+ let over_arr: Vec<Value> = match ${op.over} {
268
+ Ok(Value::Arr(a)) => a,
269
+ Ok(_) => {
270
+ *err_cell = Some(behavior_contracts::BehaviorError::new(
271
+ "MAP_OVER_NOT_ARRAY",
272
+ format!("map '${op.id}': 'over' did not evaluate to an array"),
273
+ ));
274
+ return ExecOutcome::Error("aborted".to_string());
275
+ }
276
+ Err(e) => {
277
+ *err_cell = Some(e.into());
278
+ return ExecOutcome::Error("aborted".to_string());
279
+ }
280
+ };
281
+ let mut kept_idx: Vec<usize> = Vec::new();
282
+ ${loopBody}
283
+ }`;
284
+ }
285
+ /**
286
+ * 1ノードの exec 分岐本体(index で分岐 — node_kind ディスパッチではない)。生成コードは
287
+ * `i == <index>` で確定した分岐に入る(実行時の種別判定は無い)。
288
+ */
289
+ function emitExecArm(op) {
290
+ if (op.kind === "map")
291
+ return emitMapArm(op);
292
+ if (op.kind === "cond") {
293
+ // cond は純 Expression。scope を渡して1式評価(handler は呼ばない)。式評価失敗は
294
+ // BehaviorError へ写して err_cell に載せ、run_plan を "aborted" で巻き戻す。ok 結果は
295
+ // results に足す(後続ノード・output が参照できるように — run_behavior と同一)。
296
+ return ` if i == ${op.index} {
297
+ match ${op.expr} {
298
+ Ok(v) => {
299
+ results_cell.push((op.id.clone(), v.clone()));
300
+ return ExecOutcome::Ok(v);
301
+ }
302
+ Err(e) => {
303
+ *err_cell = Some(e.into());
304
+ return ExecOutcome::Error("aborted".to_string());
305
+ }
306
+ }
307
+ }`;
308
+ }
309
+ // componentRef: 各 port を名前付き(native or primitive)呼びで評価 → handler 注入呼び。
310
+ // port 評価は `?` を使うため R を返す**名前付き**クロージャに畳む(即時実行 IIFE は
311
+ // clippy::redundant_closure_call になるため、宣言と呼び出しを分ける)。Err は err_cell へ写す。
312
+ const portRows = op.ports.length === 0
313
+ ? " Ok(Vec::new())"
314
+ : ` Ok(vec![\n${op.ports
315
+ .map((pt) => ` (${rustStrLit(pt.name)}.to_string(), (${pt.expr})?),`)
316
+ .join("\n")}\n ])`;
317
+ return ` if i == ${op.index} {
318
+ let eval_ports =
319
+ || -> Result<Vec<(String, Value)>, behavior_contracts::ExprFailure> {
320
+ ${portRows}
321
+ };
322
+ let ports = match eval_ports() {
323
+ Ok(p) => p,
324
+ Err(e) => {
325
+ *err_cell = Some(e.into());
326
+ return ExecOutcome::Error("aborted".to_string());
327
+ }
328
+ };
329
+ let outcome = match handlers.exec_ctx(${rustStrLit(op.id)}, ${rustStrLit(op.component)}, &ports, None) {
330
+ Some(o) => o,
331
+ None => {
332
+ *err_cell = Some(unknown_component(${rustStrLit(op.component)}));
333
+ return ExecOutcome::Error("aborted".to_string());
334
+ }
335
+ };
336
+ if let ExecOutcome::Ok(v) = &outcome {
337
+ results_cell.push((op.id.clone(), v.clone()));
338
+ }
339
+ return outcome;
340
+ }`;
341
+ }
342
+ /**
343
+ * emitComponentFn — 1 component の直線関数を綴じる。run_behavior の実行フロー(results 蓄積 +
344
+ * base_scope + run_plan + skipped→unproduced + output 評価)を**生成コードに直線展開**する
345
+ * (汎用 exec/node_kind/eval_ports は無い。各 exec 分岐は index で確定・ハードコード)。
346
+ * run_behavior_inner と同じく err_cell(pending_err)が run_plan の合成 OP_FAILED に優先する。
347
+ */
348
+ function emitComponentFn(plan) {
349
+ const arms = plan.ops.map(emitExecArm).join("\n");
350
+ const planExpr = plan.component.plan ? emitPlanLiteral(plan.component.plan) : "None";
351
+ const output = emitExpr(plan.component.output, SCOPE);
352
+ const relationKinds = plan.opsLiteral.map((o) => (o.relationKind === "connection" ? "connection" : "single"));
353
+ const relLit = `[${relationKinds.map(rustStrLit).join(", ")}]`;
354
+ // handler を1つも呼ばない component(cond のみ等)では `handlers` を `_handlers` に(未使用 lint 回避)。
355
+ // componentRef と map(要素 handler / batched handler)は handler を呼ぶ。
356
+ const usesHandlers = plan.ops.some((o) => o.kind === "componentRef" || o.kind === "map");
357
+ const handlerParam = usesHandlers ? "handlers" : "_handlers";
358
+ // output が scope を参照するか(純リテラル output では scope closure を作らない)。
359
+ const outputUsesScope = output.includes(SCOPE);
360
+ const outputScope = outputUsesScope
361
+ ? ` let scope = || -> Vec<(String, Value)> {
362
+ let mut s: Vec<(String, Value)> = input.to_vec();
363
+ s.extend(results.iter().cloned());
364
+ s
365
+ };
366
+ `
367
+ : "";
368
+ return `fn run_${sanitize(plan.name)}<H: ComponentExec>(
369
+ ${handlerParam}: &mut H,
370
+ input: &[(String, Value)],
371
+ ) -> Result<Value, BehaviorError> {
372
+ let ops: Vec<OpSpec> = ${emitOpsLiteral(plan)};
373
+ let relation_kinds: [&str; ${relationKinds.length}] = ${relLit};
374
+ let mut results: Vec<(String, Value)> = Vec::new();
375
+ let mut pending_err: Option<BehaviorError> = None;
376
+
377
+ let run = {
378
+ let results_cell = &mut results;
379
+ let err_cell = &mut pending_err;
380
+ // 各 exec 分岐は index で確定(node_kind ディスパッチではない)。scope() は「input +
381
+ // それまでの ok 結果」のその時点スナップ(run_behavior の base_scope と同一・決定的)。
382
+ let exec = |op: &OpSpec, _bound: Option<&Value>| -> ExecOutcome {
383
+ if err_cell.is_some() {
384
+ return ExecOutcome::Error("aborted".to_string());
385
+ }
386
+ let i = match ops.iter().position(|o| o.id == op.id) {
387
+ Some(i) => i,
388
+ None => {
389
+ *err_cell = Some(no_exec_arm(&op.id));
390
+ return ExecOutcome::Error("aborted".to_string());
391
+ }
392
+ };
393
+ let scope = || -> Vec<(String, Value)> {
394
+ let mut s: Vec<(String, Value)> = input.to_vec();
395
+ s.extend(results_cell.iter().cloned());
396
+ s
397
+ };
398
+ let _ = &scope;
399
+ ${arms}
400
+ *err_cell = Some(no_exec_arm(&op.id));
401
+ ExecOutcome::Error("aborted".to_string())
402
+ };
403
+ run_plan(${planExpr}, &ops, exec)
404
+ };
405
+
406
+ // exec 内で立てた BehaviorError は run_plan が返す合成 OP_FAILED に優先する。
407
+ if let Some(e) = pending_err {
408
+ return Err(e);
409
+ }
410
+ let run = run?;
411
+
412
+ // Skip ノードは unproduced 表現を results に足す(output が ref/coalesce できるように)。
413
+ for id_val in run.skipped.iter() {
414
+ if let Some(pos) = ops.iter().position(|o| &o.id == id_val) {
415
+ let kind = if relation_kinds[pos] == "connection" {
416
+ Some(RelationKind::Connection)
417
+ } else {
418
+ Some(RelationKind::Single)
419
+ };
420
+ if !results.iter().any(|(k, _)| k == id_val) {
421
+ results.push((id_val.clone(), ${P}::unproduced_value(kind)));
422
+ }
423
+ }
424
+ }
425
+ ${outputScope}
426
+ Ok(${output}?)
427
+ }`;
428
+ }
429
+ /** plan(ExecutionPlanSpec)リテラルを rust の `Some(&ExecutionPlanSpec{..})` へ(fully-qualified)。 */
430
+ function emitPlanLiteral(plan) {
431
+ const p = plan;
432
+ const groups = (p.groups ?? []).map((g) => `vec![${g.join(", ")}]`).join(", ");
433
+ const concurrency = p.concurrency ?? 1;
434
+ return `Some(&behavior_contracts::ExecutionPlanSpec { groups: vec![${groups}], concurrency: ${concurrency} })`;
435
+ }
436
+ function emitComponent(plan, _ctx) {
437
+ return emitComponentFn(plan);
438
+ }
439
+ /** rustfmt の fits-on-one-line 規則を模倣した COMPONENT_NAMES 配列 emit。 */
440
+ function componentNamesConst(names) {
441
+ const items = names.map(rustStrLit);
442
+ const oneLine = `pub const COMPONENT_NAMES: [&str; ${names.length}] = [${items.join(", ")}];`;
443
+ if (oneLine.length <= 100)
444
+ return oneLine;
445
+ return `pub const COMPONENT_NAMES: [&str; ${names.length}] = [\n${items.map((s) => ` ${s},`).join("\n")}\n];`;
446
+ }
447
+ function emitModule(plans, ctx) {
448
+ const { fingerprint, specVersions, componentNames, runtimeImport } = ctx;
449
+ const irLiteral = emitDocLiteral(ctx.ir, "rust", 1);
450
+ const fns = plans.map((p) => emitComponent(p, ctx)).join("\n\n");
451
+ const dispatchArms = plans
452
+ .map((p) => ` ${rustStrLit(p.name)} => run_${sanitize(p.name)}(&mut self.handlers, input),`)
453
+ .join("\n");
454
+ return `// GENERATED by behavior-contracts common generator (bc#39, straight-line) — DO NOT EDIT.
455
+ // Input: portable component-graph IR only (scp-ir-architecture.md §5/§7.4).
456
+ // This is the STRAIGHT-LINE codegen endpoint (typed-codegen.md §4.1 / bc#39 A2-rust): each
457
+ // component is emitted as a NATIVE rust function that drives the plan via the run_plan
458
+ // primitive and evaluates every port + output. SIMPLE expressions are DE-INTERPRETED to
459
+ // native rust (Phase B win, largest in rust): concat -> primitives::concat_native (push_str,
460
+ // no evaluate), ref/refOpt with a static path -> primitives::ref_native / ref_opt_native
461
+ // (native scope walk, no evaluate/json!). Overflow/short-circuit operators still go through
462
+ // the A0 evaluate-backed primitives (#36) so the fail-closed semantics stay single-sourced.
463
+ // It does NOT go through run_behavior's tree-walk (no node_kind dispatch / no eval_ports
464
+ // loop / no generic exec). Scope: componentRef + cond + simple Expression ports
465
+ // (map/batched/concurrency -> A3, hydration -> A4). Handlers are ALWAYS injected at the
466
+ // boundary; they are never generated.
467
+ // irFingerprint: ${fingerprint}
468
+
469
+ // Generated per-component function names deterministically mirror the IR component
470
+ // identifiers (which may be camelCase), so non_snake_case is expected and intentional.
471
+ #![allow(non_snake_case)]
472
+
473
+ use ${runtimeImport}::{
474
+ fingerprint_component_graph, primitives, run_plan, BehaviorError, ComponentExec, ExecOutcome,
475
+ OpSpec, RelationKind, SpecVersions, Value,
476
+ };
477
+ use serde_json::{json, Value as J};
478
+ use std::sync::LazyLock;
479
+
480
+ /// Spec versions baked at generation time (fail-closed comparison on first use).
481
+ pub const EXPECTED_SPEC_VERSIONS: [(&str, i64); 3] =
482
+ [("behavior", ${specVersions.behavior}), ("expression", ${specVersions.expression}), ("plan", ${specVersions.plan})];
483
+
484
+ /// FNV-1a 64 fingerprint of the source portable IR (canonical_json discipline, #208).
485
+ pub const IR_FINGERPRINT: &str = ${rustStrLit(fingerprint)};
486
+
487
+ /// Component names exposed by bind(), in IR declaration order.
488
+ ${componentNamesConst(componentNames)}
489
+
490
+ /// The portable component-graph IR, built once on first use — embedded for the
491
+ /// load-time fingerprint self-check ONLY (execution never walks it; the straight-line
492
+ /// functions drive the plan directly).
493
+ pub static IR: LazyLock<J> = LazyLock::new(|| {
494
+ let ir = json!(${irLiteral});
495
+ check_generated_module(&ir);
496
+ ir
497
+ });
498
+
499
+ fn runtime_spec_version(key: &str) -> i64 {
500
+ match key {
501
+ "behavior" => SpecVersions::BEHAVIOR,
502
+ "expression" => SpecVersions::EXPRESSION,
503
+ "plan" => SpecVersions::PLAN,
504
+ other => {
505
+ panic!("behavior-contracts generated module: unknown spec key '{other}' (fail-closed)")
506
+ }
507
+ }
508
+ }
509
+
510
+ // First-use fail-closed checks (#208 prepared-artifact discipline).
511
+ fn check_generated_module(ir: &J) {
512
+ for (key, want) in EXPECTED_SPEC_VERSIONS {
513
+ let got = runtime_spec_version(key);
514
+ if got != want {
515
+ panic!("behavior-contracts generated module: spec-version skew for '{key}' (generated={want}, runtime={got}) — regenerate against this runtime (fail-closed)");
516
+ }
517
+ }
518
+ for name in COMPONENT_NAMES {
519
+ let found = ir["components"]
520
+ .as_array()
521
+ .is_some_and(|cs| cs.iter().any(|c| c["name"] == name));
522
+ if !found {
523
+ panic!("behavior-contracts generated module: component '{name}' missing from the embedded IR — the generated code was modified or corrupted (fail-closed)");
524
+ }
525
+ }
526
+ let got_fp = fingerprint_component_graph(ir).unwrap_or_else(|e| {
527
+ panic!(
528
+ "behavior-contracts generated module: fingerprint recompute failed: {e} (fail-closed)"
529
+ )
530
+ });
531
+ if got_fp != IR_FINGERPRINT {
532
+ panic!("behavior-contracts generated module: IR fingerprint mismatch (baked={IR_FINGERPRINT}, embedded literal={got_fp}) — the generated code was modified or corrupted (fail-closed)");
533
+ }
534
+ }
535
+
536
+ /// UNKNOWN_COMPONENT の fail-closed error(run_behavior と同一コード・文言)。
537
+ /// cond のみの component だけを含むモジュールでは未使用になり得る(generated helper)。
538
+ #[allow(dead_code)]
539
+ fn unknown_component(component: &str) -> BehaviorError {
540
+ BehaviorError::new("UNKNOWN_COMPONENT", format!("component '{component}' has no handler (fail-closed)"))
541
+ }
542
+
543
+ /// 生成された exec 分岐に無い op(決定的には起きない — fail-closed)。
544
+ fn no_exec_arm(id: &str) -> BehaviorError {
545
+ BehaviorError::new("UNKNOWN_NODE_KIND", format!("op '{id}' has no generated exec arm (fail-closed)"))
546
+ }
547
+
548
+ // ── straight-line component functions (no run_behavior tree-walk) ──────────────────
549
+ ${fns}
550
+
551
+ /// bind — inject handlers (boundary injection; catalog name → implementation) and get an
552
+ /// executor. Each \`call\` runs the straight-line function for that component (plan via
553
+ /// run_plan primitive + per-node native/primitive port eval + injected handler) — NOT the
554
+ /// run_behavior tree-walk. Observationally equivalent to the run_behavior path: same values,
555
+ /// same emitted op sequence, same Failure code. Forces the first-use fail-closed checks.
556
+ pub fn bind<H: ComponentExec>(handlers: H) -> Bound<H> {
557
+ LazyLock::force(&IR);
558
+ Bound { handlers }
559
+ }
560
+
561
+ pub struct Bound<H: ComponentExec> {
562
+ handlers: H,
563
+ }
564
+
565
+ impl<H: ComponentExec> Bound<H> {
566
+ pub fn call(&mut self, name: &str, input: &[(String, Value)]) -> Result<Value, BehaviorError> {
567
+ match name {
568
+ ${dispatchArms}
569
+ other => Err(BehaviorError::new(
570
+ "UNKNOWN_ENTRY",
571
+ format!("component '{other}' not found in this module (fail-closed)"),
572
+ )),
573
+ }
574
+ }
575
+ }
576
+ `;
577
+ }
578
+ const dialect = {
579
+ emitExpr,
580
+ mapScopeVar: MAP_SCOPE,
581
+ emitComponent,
582
+ emitModule,
583
+ };
584
+ /**
585
+ * rust-typed(bc#48)が struct-native exec を綴じるために再利用する内部 emit ヘルパ。straight-line の
586
+ * plan/handler-dispatch SSoT(run_plan primitive + handlers.exec_ctx + native/primitive port eval)を
587
+ * そのまま使い、「結果を Value scope でなく struct scope に持つ」差分だけを typed 側で足すための seam。
588
+ * primitive namespace(P)と ops/plan リテラル・式 emit・sanitize を共有する(意味論の二重実装を避ける)。
589
+ * go の {@link goStraightlineInternals} と同型(seam が language-neutral であることの担保)。
590
+ */
591
+ export const rustStraightlineInternals = {
592
+ P,
593
+ SCOPE,
594
+ emitExpr,
595
+ emitOpsLiteral,
596
+ emitPlanLiteral,
597
+ rustStrLit,
598
+ sanitize,
599
+ dialect,
600
+ };
601
+ function emit(ctx) {
602
+ return emitStraightlineModule(ctx, dialect, SCOPE);
603
+ }
604
+ /**
605
+ * rustStraightlineEmitter — 言語識別子 `"rust-straightline"` の emitter plugin。既存の `rust`
606
+ * (リテラル焼き込み・endpoint 3・run_behavior 丸投げ)と併存する additive な第2モード。
607
+ */
608
+ export const rustStraightlineEmitter = {
609
+ language: "rust-straightline",
610
+ fileExtension: ".rs",
611
+ defaultRuntimeImport: "behavior_contracts",
612
+ filenameHint: "behaviors_straightline_generated.rs",
613
+ emit,
614
+ };
615
+ //# sourceMappingURL=emit-straightline-rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-straightline-rust.js","sourceRoot":"","sources":["../../src/generator/emit-straightline-rust.ts"],"names":[],"mappings":"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"}