sdk

Radroots SDK and bindings
git clone https://radroots.dev/git/sdk.git
Log | Files | Refs | README

commit a62ed10ab334f9efb45e6d4dde0709f2435ce32a
parent 9ec93888cc620eb304249745c114b2395d82a97f
Author: triesap <tyson@radroots.org>
Date:   Wed, 24 Jun 2026 07:53:27 +0000

dto: render events indexed bindings

- Switch events-indexed type output to the dto registry renderer.

- Inject the shard id package alias while preserving declaration order.

- Remove binding_model from the migrated events-indexed binding crate.

- Validate indexed output through xtask, workspace, and package checks.

Diffstat:
MCargo.lock | 8++++++--
Mcrates/events_indexed_bindings/Cargo.toml | 1-
Mcrates/events_indexed_bindings/src/lib.rs | 76++++++++++++----------------------------------------------------------------
Mtools/xtask/Cargo.toml | 2+-
Mtools/xtask/src/dto_roots.rs | 46++++++++++++++++++++++++++++++++++++++++++++++
Mtools/xtask/src/output.rs | 4++--
6 files changed, 67 insertions(+), 70 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -1783,13 +1783,17 @@ dependencies = [ [[package]] name = "radroots_events_indexed" version = "0.1.0-alpha.2" +dependencies = [ + "dto_bindgen", + "dto_bindgen_core", + "serde", +] [[package]] name = "radroots_events_indexed_bindings" version = "0.1.0" dependencies = [ "radroots_events_indexed", - "radroots_sdk_binding_model", ] [[package]] @@ -2087,7 +2091,7 @@ dependencies = [ "radroots_core", "radroots_events", "radroots_events_bindings", - "radroots_events_indexed_bindings", + "radroots_events_indexed", "radroots_identity_bindings", "radroots_replica_db_schema_bindings", "radroots_sdk_binding_model", diff --git a/crates/events_indexed_bindings/Cargo.toml b/crates/events_indexed_bindings/Cargo.toml @@ -9,5 +9,4 @@ homepage.workspace = true publish = false [dependencies] -radroots_sdk_binding_model = { path = "../binding_model" } radroots_events_indexed = { workspace = true } diff --git a/crates/events_indexed_bindings/src/lib.rs b/crates/events_indexed_bindings/src/lib.rs @@ -1,74 +1,22 @@ pub use radroots_events_indexed as upstream; -use radroots_sdk_binding_model as ts; - -pub fn types_module() -> ts::TsModule { - ts::module(vec![ - ts::type_alias("RadrootsEventsIndexedShardId", ts::string()), - ts::type_alias( - "RadrootsEventsIndexedIdRange", - ts::object(vec![ - ts::field("start", ts::string()), - ts::field("end", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsEventsIndexedShardMetadata", - ts::object(vec![ - ts::field("file", ts::string()), - ts::field("count", ts::number()), - ts::field("first_id", ts::string()), - ts::field("last_id", ts::string()), - ts::field("first_published_at", ts::number()), - ts::field("last_published_at", ts::number()), - ts::field("sha256", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsEventsIndexedManifest", - ts::object(vec![ - ts::field("country", ts::string()), - ts::field("total", ts::number()), - ts::field("shard_size", ts::number()), - ts::field("first_published_at", ts::number()), - ts::field("last_published_at", ts::number()), - ts::field( - "shards", - ts::array(ts::reference("RadrootsEventsIndexedShardMetadata")), - ), - ]), - ), - ts::type_alias( - "RadrootsEventsIndexedShardCheckpoint", - ts::object(vec![ - ts::field("shard_id", ts::reference("RadrootsEventsIndexedShardId")), - ts::field("last_created_at", ts::number()), - ts::field("last_event_id", ts::nullable(ts::string())), - ts::field("cursor", ts::nullable(ts::string())), - ]), - ), - ts::type_alias( - "RadrootsEventsIndexedIndexCheckpoint", - ts::object(vec![ - ts::field("generated_at", ts::number()), - ts::field( - "shards", - ts::array(ts::reference("RadrootsEventsIndexedShardCheckpoint")), - ), - ]), - ), - ]) -} +pub const TYPE_EXPORTS: &[&str] = &[ + "RadrootsEventsIndexedShardId", + "RadrootsEventsIndexedIdRange", + "RadrootsEventsIndexedShardMetadata", + "RadrootsEventsIndexedManifest", + "RadrootsEventsIndexedShardCheckpoint", + "RadrootsEventsIndexedIndexCheckpoint", +]; #[cfg(test)] mod tests { - use super::types_module; + use super::TYPE_EXPORTS; #[test] fn exports_indexed_manifest_and_checkpoint_types() { - let rendered = types_module().render(); - assert!(rendered.contains("export type RadrootsEventsIndexedManifest")); - assert!(rendered.contains("export type RadrootsEventsIndexedIndexCheckpoint")); - assert!(rendered.contains("export type RadrootsEventsIndexedShardId = string")); + assert!(TYPE_EXPORTS.contains(&"RadrootsEventsIndexedManifest")); + assert!(TYPE_EXPORTS.contains(&"RadrootsEventsIndexedIndexCheckpoint")); + assert!(TYPE_EXPORTS.contains(&"RadrootsEventsIndexedShardId")); } } diff --git a/tools/xtask/Cargo.toml b/tools/xtask/Cargo.toml @@ -18,7 +18,7 @@ radroots_sdk_binding_model = { path = "../../crates/binding_model" } radroots_core = { workspace = true, features = ["dto-bindgen"] } radroots_events = { workspace = true, features = ["dto-bindgen"] } radroots_events_bindings = { path = "../../crates/events_bindings" } -radroots_events_indexed_bindings = { path = "../../crates/events_indexed_bindings" } +radroots_events_indexed = { workspace = true, features = ["dto-bindgen"] } radroots_identity_bindings = { path = "../../crates/identity_bindings" } radroots_replica_db_schema_bindings = { path = "../../crates/replica_db_schema_bindings" } radroots_types_bindings = { path = "../../crates/types_bindings" } diff --git a/tools/xtask/src/dto_roots.rs b/tools/xtask/src/dto_roots.rs @@ -41,6 +41,10 @@ pub const DTO_PACKAGE_ROOTS: &[DtoPackageRootSet] = &[ package_key: "events", roots: events_roots, }, + DtoPackageRootSet { + package_key: "events_indexed", + roots: events_indexed_roots, + }, ]; pub const MANUAL_DESCRIPTOR_FAMILIES: &[ManualDescriptorFamily] = &[ @@ -132,6 +136,17 @@ pub fn events_types_module() -> Result<DtoTypesModule, String> { )) } +pub fn events_indexed_types_module() -> Result<DtoTypesModule, String> { + let root_set = package_root_set("events_indexed") + .ok_or_else(|| "missing events-indexed DTO roots".to_owned())?; + let rendered = + render_registry_types(&root_set.registry(), &DtoRegistryRenderOptions::default())?; + Ok(DtoTypesModule::new( + rendered.imports_ts().unwrap_or_default(), + with_events_indexed_sdk_wrappers(rendered.body_ts()), + )) +} + fn core_roots() -> Vec<RootDescriptor> { radroots_core::dto::dto_roots().into_iter().collect() } @@ -140,6 +155,12 @@ fn events_roots() -> Vec<RootDescriptor> { radroots_events::dto::dto_roots().into_iter().collect() } +fn events_indexed_roots() -> Vec<RootDescriptor> { + radroots_events_indexed::dto::dto_roots() + .into_iter() + .collect() +} + fn core_import_options( registry: &Registry, mut options: DtoRegistryRenderOptions, @@ -193,6 +214,30 @@ fn declaration_name(declaration: &str) -> &str { .unwrap_or(declaration) } +fn with_events_indexed_sdk_wrappers(body: &str) -> String { + let mut declarations = body + .split("\n\n") + .filter(|declaration| !declaration.trim().is_empty()) + .map(str::to_owned) + .collect::<Vec<_>>(); + declarations.push("export type RadrootsEventsIndexedShardId = string;".to_owned()); + let order = [ + "RadrootsEventsIndexedShardId", + "RadrootsEventsIndexedIdRange", + "RadrootsEventsIndexedShardMetadata", + "RadrootsEventsIndexedManifest", + "RadrootsEventsIndexedShardCheckpoint", + "RadrootsEventsIndexedIndexCheckpoint", + ]; + declarations.sort_by_key(|declaration| { + order + .iter() + .position(|name| *name == declaration_name(declaration)) + .unwrap_or(order.len()) + }); + declarations.join("\n\n") +} + #[cfg(test)] mod tests { use super::{ @@ -323,6 +368,7 @@ mod tests { fn package_roots_are_explicit_not_discovered() { assert!(package_root_set("core").is_some()); assert!(package_root_set("events").is_some()); + assert!(package_root_set("events_indexed").is_some()); assert!(package_root_set("trade").is_none()); } diff --git a/tools/xtask/src/output.rs b/tools/xtask/src/output.rs @@ -98,8 +98,8 @@ pub fn package_outputs() -> Result<Vec<PackageOutput>, String> { }, PackageOutput { spec: spec_by_key("events_indexed"), - types_ts: Some(TsSource::Module( - radroots_events_indexed_bindings::types_module(), + types_ts: Some(TsSource::DtoRegistry( + dto_roots::events_indexed_types_module()?, )), types_imports_ts: None, constants_ts: None,