prost_wkt_types/pbtime/
mod.rs

1mod datetime;
2
3mod duration;
4pub use duration::DurationError;
5
6mod timestamp;
7pub use timestamp::TimestampError;
8
9use core::convert::TryFrom;
10use core::str::FromStr;
11use core::*;
12use core::time;
13use std::convert::TryInto;
14
15use chrono::prelude::*;
16
17use serde::de::{self, Deserialize, Deserializer, Visitor};
18use serde::ser::{Serialize, Serializer};
19
20include!(concat!(env!("OUT_DIR"), "/pbtime/google.protobuf.rs"));
21
22////////////////////////////////////////////////////////////////////////////////
23/// FROM prost-types/src/lib.rs
24/// with impl Name removed until stabilized
25////////////////////////////////////////////////////////////////////////////////
26const NANOS_PER_SECOND: i32 = 1_000_000_000;
27const NANOS_MAX: i32 = NANOS_PER_SECOND - 1;
28
29
30#[cfg(test)]
31mod tests {
32
33    use crate::pbtime::*;
34    use chrono::{DateTime, Utc};
35
36    #[test]
37    fn serialize_duration_check_output() {
38        // protobuf JSON specification is as follows:
39        // Generated output always contains 0, 3, 6, or 9 fractional digits, depending on required precision, followed by the suffix "s". Accepted are any fractional digits (also none) as long as they fit into nano-seconds precision and the suffix "s" is required.
40        // see: https://protobuf.dev/programming-guides/proto3/#json
41
42        let duration = Duration {
43            seconds: 10,
44            nanos: 300,
45        };
46        let json = serde_json::to_string_pretty(&duration).expect("json");
47        assert_eq!(json, r#""10.000000300s""#);
48    }
49
50    #[test]
51    fn deserialize_duration_whole_seconds() {
52        let got: Duration = serde_json::from_str(r#""10s""#).expect("json");
53
54        let want = Duration {
55            seconds: 10,
56            nanos: 0,
57        };
58        assert_eq!(got, want);
59    }
60
61    #[test]
62    fn serialize_duration() {
63        let duration = Duration {
64            seconds: 10,
65            nanos: 100,
66        };
67        let json = serde_json::to_string_pretty(&duration).expect("json");
68        println!("{json}");
69        let back: Duration = serde_json::from_str(&json).expect("duration");
70        assert_eq!(duration, back);
71    }
72
73    #[test]
74    fn invalid_timestamp_test() {
75        let ts = Timestamp {
76            seconds: 10,
77            nanos: 2000000000,
78        };
79        let datetime_utc: DateTime<Utc> = ts.into();
80
81        println!("{datetime_utc:?}");
82    }
83
84    #[test]
85    fn test_duration_conversion_pb_to_chrono() {
86        let duration = Duration {
87            seconds: 10,
88            nanos: 100,
89        };
90        let chrono_duration: chrono::Duration = duration.into();
91        assert_eq!(chrono_duration.num_seconds(), 10);
92        assert_eq!((chrono_duration - chrono::Duration::try_seconds(10).expect("seconds")).num_nanoseconds(), Some(100));
93    }
94
95    #[test]
96    fn test_duration_conversion_chrono_to_pb() {
97        let chrono_duration = chrono::Duration::try_seconds(10).expect("seconds") + chrono::Duration::nanoseconds(100);
98        let duration: Duration = chrono_duration.into();
99        assert_eq!(duration.seconds, 10);
100        assert_eq!(duration.nanos, 100);
101    }
102}