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:
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"));
+ }
}