diff --git a/crates/crates_io_index/data.rs b/crates/crates_io_index/data.rs index 44412f03ca4..dfe9b380115 100644 --- a/crates/crates_io_index/data.rs +++ b/crates/crates_io_index/data.rs @@ -1,4 +1,5 @@ use crate::features::FeaturesMap; +use crate::ser::serialize_pubtime; use chrono::{DateTime, Utc}; use std::cmp::Ordering; @@ -26,7 +27,10 @@ pub struct Crate { #[serde(skip_serializing_if = "Option::is_none")] pub rust_version: Option, /// Publication timestamp in ISO8601 format - #[serde(skip_serializing_if = "Option::is_none")] + #[serde( + skip_serializing_if = "Option::is_none", + serialize_with = "serialize_pubtime" + )] pub pubtime: Option>, /// The schema version for this entry. /// diff --git a/crates/crates_io_index/ser.rs b/crates/crates_io_index/ser.rs index 3e48ba10780..75ab735ad37 100644 --- a/crates/crates_io_index/ser.rs +++ b/crates/crates_io_index/ser.rs @@ -1,4 +1,6 @@ use crate::Crate; +use chrono::{DateTime, Utc}; +use serde::Serializer; use std::io::Write; fn write_crate(krate: &Crate, mut writer: W) -> anyhow::Result<()> { @@ -14,6 +16,21 @@ pub fn write_crates(crates: &[Crate], mut writer: W) -> anyhow::Result Ok(()) } +/// Serialize `pubtime` with seconds precision `DateTime` +pub fn serialize_pubtime(dt: &Option>, serializer: S) -> Result +where + S: Serializer, +{ + match dt { + Some(dt) => { + let secs = dt.timestamp(); + let dt_secs = DateTime::from_timestamp(secs, 0).unwrap(); + serializer.serialize_some(&dt_secs) + } + None => serializer.serialize_none(), + } +} + #[cfg(test)] mod tests { use super::*; @@ -21,6 +38,7 @@ mod tests { #[test] fn test_write_crate() { + let pubtime = chrono::DateTime::from_timestamp_nanos(1_763_456_303_013_233_232); let krate = Crate { name: "foo".to_string(), vers: "1.2.3".to_string(), @@ -31,7 +49,7 @@ mod tests { yanked: None, links: None, rust_version: None, - pubtime: None, + pubtime: Some(pubtime), v: None, }; let mut buffer = Vec::new(); @@ -39,7 +57,7 @@ mod tests { assert_ok_eq!( String::from_utf8(buffer), "\ - {\"name\":\"foo\",\"vers\":\"1.2.3\",\"deps\":[],\"cksum\":\"0123456789asbcdef\",\"features\":{},\"yanked\":null}\n\ + {\"name\":\"foo\",\"vers\":\"1.2.3\",\"deps\":[],\"cksum\":\"0123456789asbcdef\",\"features\":{},\"yanked\":null,\"pubtime\":\"2025-11-18T08:58:23Z\"}\n\ " ); }