prost_wkt_types/pbtime/
mod.rs1mod 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
22const 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 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}