lib

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

commit ca452da302381686d7be2a363ab8dd6c2f2eb475
parent c9d94a1790761823cd1a994b48f3a92097754eff
Author: triesap <tyson@radroots.org>
Date:   Thu,  5 Mar 2026 01:05:32 +0000

events-indexed: close serde_ext strict region gap

Diffstat:
MCargo.lock | 1+
Mcrates/events-indexed/Cargo.toml | 6++++--
Mcrates/events-indexed/src/serde_ext.rs | 30++++++++++++++++++++++++------
3 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -2684,6 +2684,7 @@ name = "radroots-events-indexed" version = "0.1.0-alpha.1" dependencies = [ "serde", + "serde_json", "typeshare", ] diff --git a/crates/events-indexed/Cargo.toml b/crates/events-indexed/Cargo.toml @@ -19,4 +19,7 @@ std = [] [dependencies] serde = { workspace = true, default-features = false, features = ["alloc", "derive"], optional = true } -typeshare = { workspace = true, optional = true } -\ No newline at end of file +typeshare = { workspace = true, optional = true } + +[dev-dependencies] +serde_json = { workspace = true } diff --git a/crates/events-indexed/src/serde_ext.rs b/crates/events-indexed/src/serde_ext.rs @@ -20,23 +20,41 @@ pub mod epoch_seconds { mod tests { use super::epoch_seconds; #[cfg(not(feature = "std"))] + use alloc::format; + #[cfg(not(feature = "std"))] use alloc::string::ToString; - use serde::de::value::{Error as DeError, U64Deserializer}; + use serde::Deserialize; #[cfg(feature = "std")] use std::string::ToString; + #[derive(Debug, Deserialize)] + struct EpochSecondsFixture { + #[serde(deserialize_with = "epoch_seconds::de")] + ts: u32, + } + #[test] fn epoch_seconds_accepts_u32_max() { - let de = U64Deserializer::<DeError>::new(u32::MAX as u64); - let val = epoch_seconds::de(de).unwrap(); - assert_eq!(val, u32::MAX); + let fixture: EpochSecondsFixture = + serde_json::from_str(&format!(r#"{{"ts":{}}}"#, u32::MAX)).unwrap(); + assert_eq!(fixture.ts, u32::MAX); } #[test] fn epoch_seconds_rejects_overflow() { - let de = U64Deserializer::<DeError>::new(u32::MAX as u64 + 1); - let err = epoch_seconds::de(de).unwrap_err(); + let err = serde_json::from_str::<EpochSecondsFixture>(&format!( + r#"{{"ts":{}}}"#, + u32::MAX as u64 + 1 + )) + .unwrap_err(); let msg = err.to_string(); assert!(msg.contains("epoch **seconds**")); } + + #[test] + fn epoch_seconds_rejects_invalid_input_type() { + let err = serde_json::from_str::<EpochSecondsFixture>(r#"{"ts":"1700000000"}"#).unwrap_err(); + let msg = err.to_string(); + assert!(msg.contains("invalid type")); + } }