lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

commit e3859f4d4b41f1aa3d396f1f378060f704719573
parent a06255f2a44c5161b3abf4289c91668fd7e2fea4
Author: triesap <tyson@radroots.org>
Date:   Wed, 24 Jun 2026 08:21:11 +0000

dto: repair indexed checkpoint descriptors

Diffstat:
Mcrates/events_indexed/src/dto.rs | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
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(&registry, "RadrootsEventsIndexedShardCheckpoint"); + let index_checkpoint = find_struct(&registry, "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(&registry, "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") } }