behavior_contracts/lib.rs
1//! behavior-contracts — language-neutral IR runtime COMMON core (Rust).
2//!
3//! Ports the same thin COMMON primitives as the TS/Python references. No backend,
4//! key-resolution, retry-tuning, or DSL-specific concepts — those live in consumers.
5//!
6//! Public COMMON primitives (runtime-boundary.md §2.1):
7//! - [`validate_envelope`] — spec-version fail-closed check
8//! - [`evaluate_expression`] — expression-ir.md normative evaluation
9//! - [`render_template`] — `{param}` strict rendering
10//! - [`run_plan`] — execution-plan skeleton (stage / Skip propagation / Policy Kind)
11//! - [`canonical_value`] / [`canonical_json`] / [`py_float_repr`] — canonical serialization
12//! - [`assert_portable`] — Portability Guard
13//! - [`decode_value`] / [`deep_equals`] — conformance runner adapter COMMON part
14
15pub mod behavior;
16pub mod canonical;
17#[cfg(feature = "ir")]
18pub mod codec;
19#[cfg(feature = "ir")]
20pub mod envelope;
21pub mod expr;
22#[cfg(feature = "ir")]
23pub mod fingerprint;
24#[cfg(feature = "ir")]
25pub mod guard;
26pub mod plan;
27pub mod primitives;
28pub mod rawabi;
29pub mod template;
30pub mod value;
31
32/// Supported spec versions (IR/vector versions; distinct from the crate semver).
33pub struct SpecVersions;
34impl SpecVersions {
35 pub const EXPRESSION: i64 = 2; // v2: obj __proto__ own key -> FORBIDDEN_KEY (fail-closed)
36 pub const TEMPLATE: i64 = 1;
37 pub const PLAN: i64 = 1;
38 pub const CANONICAL: i64 = 2; // v2: obj value __proto__ own key -> FORBIDDEN_KEY (fail-closed)
39 pub const BEHAVIOR: i64 = 2; // v2: map.when / map.into / map.batched / handler ctx (bc#22; v1 IR semantics unchanged)
40 pub const GUARD: i64 = 1; // v1 (bc#25: vector-pin assert_portable_component_graph accept/reject)
41 pub const C2: i64 = 1; // v1 (bc#28: c2-catalog-swap — catalog-swap execution + IR structural identity)
42}
43
44/// Default graphddb-shaped supported envelope version (`"<major>.<minor>"`).
45pub const ENVELOPE_SPEC_VERSION: &str = "1.1";
46
47// ── re-exports (public surface) ──────────────────────────────────────────────
48pub use value::{deep_equals, Value};
49
50#[cfg(feature = "ir")]
51pub use expr::evaluate as evaluate_expression;
52pub use expr::{cmp_code_points, ExprFailure, ExprFailureCode};
53
54pub use template::{render_template, resolve_partial, TemplateFailure, TemplateFailureCode};
55
56pub use plan::{
57 run_plan, run_plan_parallel, ExecOutcome, ExecutionPlanSpec, OpSpec, PlanFailure,
58 PlanFailureCode, PolicyKind, RelationKind, RunResult,
59};
60
61pub use canonical::{
62 canonical_json, canonical_value, py_float_repr, CanonicalFailure, CanonicalFailureCode,
63};
64
65#[cfg(feature = "ir")]
66pub use envelope::{validate_envelope, EnvelopeFailure, EnvelopeFailureCode};
67
68#[cfg(feature = "ir")]
69pub use guard::{
70 assert_portable, assert_portable_component_graph, PortabilityError, PORTABLE_EXPR_OPERATORS,
71};
72
73#[cfg(feature = "ir")]
74pub use behavior::run_behavior;
75pub use behavior::{BehaviorError, BehaviorFailureCode, ComponentExec};
76
77// bc#76: RAW handler ABI — the de-boxed handler boundary (RawValue/RawRow, NOT Value).
78pub use rawabi::{
79 raw_from_value, raw_missing_prop, raw_type_mismatch, RawComponentExec, RawOutcome, RawRow,
80 RawValue,
81};
82
83// bc 0.5.0: native PORTS ABI — the de-plumbed port container (native struct behind PortReader,
84// NOT a Vec<(String, Value)>).
85pub use rawabi::{NativeComponentExec, PortReader};
86
87// bc#77: combined native-ports-in + raw-result-out ABI — the 1.0 read de-box (zero boxed Value
88// on both the port AND row plane; inline sequential exec, no run_plan skip-gate).
89// bc#94: the seam is nativized — the concrete ports struct flows to the handler by monomorphized
90// generic instantiation (`PortReaderT`, no `&dyn`/`as_any`/`downcast`; `&self` so a `Sync` handler
91// parallelizes without a forced `Mutex`).
92pub use rawabi::{NativeRawComponentExec, PortReaderT};
93
94#[cfg(feature = "ir")]
95pub use fingerprint::{fingerprint_component_graph, FingerprintFailure, FingerprintFailureCode};
96
97#[cfg(feature = "ir")]
98pub use codec::{decode_value, encode_value, DecodeError};
99
100// ── codegen primitive surface (bc#36 / typed-codegen.md §3.4) ─────────────────
101// 生成コードが直呼びできる安定 primitive 公開面。式演算子は `primitives` モジュールで
102// 個別関数として公開する(意味論は SSoT `evaluate_expression` へ委譲する薄いラッパ)。
103// bounded 並行 / skip・unproduced / hydration helper も同モジュールに含める。
104pub use primitives::{
105 concat_native, hydrate_into, map_with_concurrency, ref_native, ref_opt_native, skip_connection,
106 skip_single, unproduced_value,
107};