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:
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,