commit e3859f4d4b41f1aa3d396f1f378060f704719573
parent a06255f2a44c5161b3abf4289c91668fd7e2fea4
Author: triesap <tyson@radroots.org>
Date: Wed, 24 Jun 2026 08:21:11 +0000
dto: repair indexed checkpoint descriptors
Diffstat:
1 file changed, 54 insertions(+), 18 deletions(-)
diff --git a/crates/events_indexed/src/dto.rs b/crates/events_indexed/src/dto.rs
@@ -1,6 +1,6 @@
use dto_bindgen_core::{
- BackendId, DescribeCtx, Dto, FieldDef, IdentName, RootDescriptor, RustTypeId, SourceSpan,
- StructDef, TargetFieldNames, TargetOverride, TypeDef, TypeRef, WireFieldNames,
+ BackendId, DescribeCtx, Dto, FieldDef, FieldPresence, IdentName, RootDescriptor, RustTypeId,
+ SourceSpan, StructDef, TargetFieldNames, TargetOverride, TypeDef, TypeRef, WireFieldNames,
};
use crate::{
@@ -40,14 +40,14 @@ impl Dto for RadrootsEventsIndexedShardCheckpoint {
"crates/events_indexed/src/checkpoint.rs",
16,
))
- .with_field(field(
+ .with_field(optional_nullable_field(
"last_event_id",
"last_event_id",
<Option<String> as Dto>::describe(ctx),
"crates/events_indexed/src/checkpoint.rs",
17,
))
- .with_field(field(
+ .with_field(optional_nullable_field(
"cursor",
"cursor",
<Option<String> as Dto>::describe(ctx),
@@ -105,6 +105,16 @@ fn shard_id_ref() -> TypeRef {
))
}
+fn optional_nullable_field(
+ rust_name: &str,
+ wire_name: &str,
+ ty: TypeRef,
+ file: &str,
+ line: u32,
+) -> FieldDef {
+ field(rust_name, wire_name, ty, file, line).with_presence(FieldPresence::optional_nullable())
+}
+
fn field(rust_name: &str, wire_name: &str, ty: TypeRef, file: &str, line: u32) -> FieldDef {
FieldDef::new(
IdentName::new(rust_name),
@@ -121,7 +131,7 @@ fn span(file: &str, line: u32) -> SourceSpan {
#[cfg(test)]
mod tests {
- use dto_bindgen_core::{Primitive, TypeDef, TypeRef, build_registry};
+ use dto_bindgen_core::{FieldDef, Primitive, StructDef, TypeDef, TypeRef, build_registry};
use super::dto_roots;
@@ -139,24 +149,50 @@ mod tests {
#[test]
fn custom_epoch_second_fields_render_as_numbers() {
let registry = build_registry(dto_roots());
- let checkpoint = registry
+ let shard_checkpoint = find_struct(®istry, "RadrootsEventsIndexedShardCheckpoint");
+ let index_checkpoint = find_struct(®istry, "RadrootsEventsIndexedIndexCheckpoint");
+
+ assert_eq!(
+ find_field(shard_checkpoint, "last_created_at").ty,
+ TypeRef::Primitive(Primitive::U32)
+ );
+ assert_eq!(
+ find_field(index_checkpoint, "generated_at").ty,
+ TypeRef::Primitive(Primitive::U32)
+ );
+ }
+
+ #[test]
+ fn optional_checkpoint_fields_are_optional_nullable() {
+ let registry = build_registry(dto_roots());
+ let checkpoint = find_struct(®istry, "RadrootsEventsIndexedShardCheckpoint");
+
+ for field_name in ["last_event_id", "cursor"] {
+ let field = find_field(checkpoint, field_name);
+
+ assert!(field.presence.nullable);
+ assert!(!field.presence.required_on_deserialize);
+ }
+ }
+
+ fn find_struct<'a>(
+ registry: &'a dto_bindgen_core::Registry,
+ export_name: &str,
+ ) -> &'a StructDef {
+ registry
.types_by_id
.values()
.find_map(|def| match def {
- TypeDef::Struct(def)
- if def.export_name == "RadrootsEventsIndexedShardCheckpoint" =>
- {
- Some(def)
- }
+ TypeDef::Struct(def) if def.export_name == export_name => Some(def),
_ => None,
})
- .expect("checkpoint descriptor");
- let field = checkpoint
- .fields
- .iter()
- .find(|field| field.target.typescript == "last_created_at")
- .expect("last_created_at field");
+ .expect("descriptor struct")
+ }
- assert_eq!(field.ty, TypeRef::Primitive(Primitive::U32));
+ fn find_field<'a>(def: &'a StructDef, typescript_name: &str) -> &'a FieldDef {
+ def.fields
+ .iter()
+ .find(|field| field.target.typescript == typescript_name)
+ .expect("descriptor field")
}
}