Skip to main content

gen_platform/
lib.rs

1//! `gen-platform` — Rust-first canonical handle for the typed-
2//! dispatcher substrate primitive (typed-tagged-union catamorphism
3//! at a language boundary). Re-exports `TypedDispatcher` +
4//! `#[derive(TypedDispatcher)]`, ships a runtime `Dispatcher<T>`
5//! applicator for Rust consumers (controllers, daemons, reactive
6//! routers, migration runners, RBAC engines, render passes), and
7//! surfaces typed catalog primitives so any pleme-io crate can
8//! stand up a typed dispatch surface against any closed variant
9//! universe with one cargo add.
10//!
11//! ## Why a dedicated crate
12//!
13//! The `mk-typed-dispatcher.nix` primitive proves the value at the
14//! Nix dispatch layer. The same shape recurs across pleme-io
15//! wherever a closed variant set drives an action.
16//! `gen-platform` is the canonical
17//! Rust-side handle so consumers in pangea-operator, engenho
18//! controllers, magma plan walkers, anomalia remediations, shinka
19//! migrations etc. reach for the same primitive instead of hand-
20//! rolling another `match` ladder.
21//!
22//! ## Surface
23//!
24//! ```ignore
25//! use gen_platform::{Dispatcher, TypedDispatcher};
26//!
27//! #[derive(serde::Serialize, serde::Deserialize, gen_platform::TypedDispatcher)]
28//! #[serde(tag = "kind", rename_all = "kebab-case")]
29//! enum Migration {
30//!     AddColumn { table: String, column: String },
31//!     DropIndex { name: String },
32//! }
33//!
34//! let dispatcher = Dispatcher::<Migration, MyCtx, MyOverride>::new()
35//!     .helper("add-column", |variant, ctx| { /* ... */ Default::default() })
36//!     .helper("drop-index", |variant, ctx| { /* ... */ Default::default() })
37//!     .into_sealed()  // enforces variant coverage
38//!     .expect("every variant has a helper");
39//!
40//! let result = dispatcher.apply(&[migration_a, migration_b], &mut ctx);
41//! ```
42//!
43//! ## Re-exports
44//!
45//! - `gen_types::TypedDispatcher` — the reflection trait.
46//! - `gen_types::DispatcherVariant` — variant envelope shape.
47//! - `gen_macros::TypedDispatcher` — `#[derive]` macro.
48//!
49//! ## New primitives (this crate)
50//!
51//! - `Dispatcher<V, C, O>` — runtime applicator. Holds typed
52//!   helpers per variant kind. `into_sealed()` proves coverage at
53//!   construction time (every reflected kind has a registered
54//!   helper) — silent unknown variants become impossible.
55//! - `SealedDispatcher<V, C, O>` — the post-seal handle; `apply`
56//!   cannot fail on coverage anymore (proven at seal time).
57//! - `DispatcherError` — typed error for build-time issues
58//!   (missing coverage, duplicate helpers).
59//! - `MergeStrategy` — how to fold per-variant overrides.
60
61#![allow(clippy::module_name_repetitions)]
62
63pub mod catalog;
64pub mod composed;
65pub mod dispatcher;
66pub mod emit;
67pub mod merge;
68
69pub use catalog::{
70    DispatcherEntry, by_label as catalog_by_label, registered as catalog_registered,
71};
72pub use composed::{ComposedDispatcher, ComposedSource};
73pub use dispatcher::{Dispatcher, DispatcherError, SealedDispatcher};
74pub use emit::to_helpers_skeleton;
75pub use merge::MergeStrategy;
76
77// Re-exports — single canonical Rust handle.
78pub use gen_macros::{
79    BackendError, Discriminant, FromStrKind, IsVariant, OutcomeLattice, TypedDispatcher,
80};
81pub use gen_types::{DispatcherVariant, TypedDispatcher as TypedDispatcherTrait};