11use crate :: Crate ;
2+ use chrono:: { DateTime , Utc } ;
3+ use serde:: Serializer ;
24use std:: io:: Write ;
35
46fn 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) ]
1835mod 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