Skip to content

Commit f2411ff

Browse files
authored
Merge pull request #12359 from Turbo87/pubtime-serde
index: Serialize `pubtime` with seconds precision
2 parents 27c438e + 5c7ab7a commit f2411ff

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

crates/crates_io_index/data.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::features::FeaturesMap;
2+
use crate::ser::serialize_pubtime;
23
use chrono::{DateTime, Utc};
34
use std::cmp::Ordering;
45

@@ -26,7 +27,10 @@ pub struct Crate {
2627
#[serde(skip_serializing_if = "Option::is_none")]
2728
pub rust_version: Option<String>,
2829
/// Publication timestamp in ISO8601 format
29-
#[serde(skip_serializing_if = "Option::is_none")]
30+
#[serde(
31+
skip_serializing_if = "Option::is_none",
32+
serialize_with = "serialize_pubtime"
33+
)]
3034
pub pubtime: Option<DateTime<Utc>>,
3135
/// The schema version for this entry.
3236
///

crates/crates_io_index/ser.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
use crate::Crate;
2+
use chrono::{DateTime, Utc};
3+
use serde::Serializer;
24
use std::io::Write;
35

46
fn write_crate<W: Write>(krate: &Crate, mut writer: W) -> anyhow::Result<()> {
@@ -14,13 +16,29 @@ pub fn write_crates<W: Write>(crates: &[Crate], mut writer: W) -> anyhow::Result
1416
Ok(())
1517
}
1618

19+
/// Serialize `pubtime` with seconds precision `DateTime<Utc>`
20+
pub fn serialize_pubtime<S>(dt: &Option<DateTime<Utc>>, serializer: S) -> Result<S::Ok, S::Error>
21+
where
22+
S: Serializer,
23+
{
24+
match dt {
25+
Some(dt) => {
26+
let secs = dt.timestamp();
27+
let dt_secs = DateTime::from_timestamp(secs, 0).unwrap();
28+
serializer.serialize_some(&dt_secs)
29+
}
30+
None => serializer.serialize_none(),
31+
}
32+
}
33+
1734
#[cfg(test)]
1835
mod tests {
1936
use super::*;
2037
use claims::*;
2138

2239
#[test]
2340
fn test_write_crate() {
41+
let pubtime = chrono::DateTime::from_timestamp_nanos(1_763_456_303_013_233_232);
2442
let krate = Crate {
2543
name: "foo".to_string(),
2644
vers: "1.2.3".to_string(),
@@ -31,15 +49,15 @@ mod tests {
3149
yanked: None,
3250
links: None,
3351
rust_version: None,
34-
pubtime: None,
52+
pubtime: Some(pubtime),
3553
v: None,
3654
};
3755
let mut buffer = Vec::new();
3856
assert_ok!(write_crate(&krate, &mut buffer));
3957
assert_ok_eq!(
4058
String::from_utf8(buffer),
4159
"\
42-
{\"name\":\"foo\",\"vers\":\"1.2.3\",\"deps\":[],\"cksum\":\"0123456789asbcdef\",\"features\":{},\"yanked\":null}\n\
60+
{\"name\":\"foo\",\"vers\":\"1.2.3\",\"deps\":[],\"cksum\":\"0123456789asbcdef\",\"features\":{},\"yanked\":null,\"pubtime\":\"2025-11-18T08:58:23Z\"}\n\
4361
"
4462
);
4563
}

0 commit comments

Comments
 (0)