2020//! assert!(read_query.is_ok());
2121//! ```
2222
23- use chrono:: prelude:: { DateTime , TimeZone , Utc } ;
24- use std:: convert:: TryInto ;
25-
2623pub mod consts;
2724mod line_proto_term;
2825pub mod read_query;
@@ -47,6 +44,21 @@ pub enum Timestamp {
4744 Hours ( u128 ) ,
4845}
4946
47+ impl Timestamp {
48+ pub fn nanos ( & self ) -> u128 {
49+ match self {
50+ Timestamp :: Hours ( h) => {
51+ h * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLIS_PER_SECOND * NANOS_PER_MILLI
52+ }
53+ Timestamp :: Minutes ( m) => m * SECONDS_PER_MINUTE * MILLIS_PER_SECOND * NANOS_PER_MILLI ,
54+ Timestamp :: Seconds ( s) => s * MILLIS_PER_SECOND * NANOS_PER_MILLI ,
55+ Timestamp :: Milliseconds ( millis) => millis * NANOS_PER_MILLI ,
56+ Timestamp :: Microseconds ( micros) => micros * NANOS_PER_MICRO ,
57+ Timestamp :: Nanoseconds ( nanos) => * nanos,
58+ }
59+ }
60+ }
61+
5062impl fmt:: Display for Timestamp {
5163 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
5264 use Timestamp :: * ;
@@ -57,44 +69,52 @@ impl fmt::Display for Timestamp {
5769 }
5870}
5971
60- impl From < Timestamp > for DateTime < Utc > {
61- fn from ( ts : Timestamp ) -> DateTime < Utc > {
62- match ts {
63- Timestamp :: Hours ( h) => {
64- let nanos =
65- h * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLIS_PER_SECOND * NANOS_PER_MILLI ;
66- Utc . timestamp_nanos ( nanos. try_into ( ) . unwrap ( ) )
67- }
68- Timestamp :: Minutes ( m) => {
69- let nanos = m * SECONDS_PER_MINUTE * MILLIS_PER_SECOND * NANOS_PER_MILLI ;
70- Utc . timestamp_nanos ( nanos. try_into ( ) . unwrap ( ) )
71- }
72- Timestamp :: Seconds ( s) => {
73- let nanos = s * MILLIS_PER_SECOND * NANOS_PER_MILLI ;
74- Utc . timestamp_nanos ( nanos. try_into ( ) . unwrap ( ) )
75- }
76- Timestamp :: Milliseconds ( millis) => {
77- let nanos = millis * NANOS_PER_MILLI ;
78- Utc . timestamp_nanos ( nanos. try_into ( ) . unwrap ( ) )
79- }
80- Timestamp :: Nanoseconds ( nanos) => Utc . timestamp_nanos ( nanos. try_into ( ) . unwrap ( ) ) ,
81- Timestamp :: Microseconds ( micros) => {
82- let nanos = micros * NANOS_PER_MICRO ;
83- Utc . timestamp_nanos ( nanos. try_into ( ) . unwrap ( ) )
84- }
85- }
72+ #[ cfg( feature = "chrono" ) ]
73+ impl From < Timestamp > for chrono:: DateTime < chrono:: Utc > {
74+ fn from ( ts : Timestamp ) -> chrono:: DateTime < chrono:: Utc > {
75+ use chrono:: TimeZone as _;
76+ chrono:: Utc . timestamp_nanos ( ts. nanos ( ) as i64 )
8677 }
8778}
8879
89- impl < T > From < DateTime < T > > for Timestamp
80+ #[ cfg( feature = "chrono" ) ]
81+ impl < T > From < chrono:: DateTime < T > > for Timestamp
9082where
91- T : TimeZone ,
83+ T : chrono :: TimeZone ,
9284{
93- fn from ( date_time : DateTime < T > ) -> Self {
85+ fn from ( date_time : chrono :: DateTime < T > ) -> Self {
9486 Timestamp :: Nanoseconds ( date_time. timestamp_nanos_opt ( ) . unwrap ( ) as u128 )
9587 }
9688}
9789
90+ #[ cfg( feature = "time" ) ]
91+ impl From < Timestamp > for time:: UtcDateTime {
92+ fn from ( value : Timestamp ) -> Self {
93+ time:: UtcDateTime :: from_unix_timestamp_nanos ( value. nanos ( ) as i128 ) . unwrap ( )
94+ }
95+ }
96+
97+ #[ cfg( feature = "time" ) ]
98+ impl From < time:: UtcDateTime > for Timestamp {
99+ fn from ( value : time:: UtcDateTime ) -> Self {
100+ Timestamp :: Nanoseconds ( value. unix_timestamp_nanos ( ) as u128 )
101+ }
102+ }
103+
104+ #[ cfg( feature = "time" ) ]
105+ impl From < Timestamp > for time:: OffsetDateTime {
106+ fn from ( value : Timestamp ) -> Self {
107+ time:: OffsetDateTime :: from_unix_timestamp_nanos ( value. nanos ( ) as i128 ) . unwrap ( )
108+ }
109+ }
110+
111+ #[ cfg( feature = "time" ) ]
112+ impl From < time:: OffsetDateTime > for Timestamp {
113+ fn from ( value : time:: OffsetDateTime ) -> Self {
114+ Timestamp :: Nanoseconds ( value. unix_timestamp_nanos ( ) as u128 )
115+ }
116+ }
117+
98118pub trait Query {
99119 /// Builds valid InfluxSQL which can be run against the Database.
100120 /// In case no fields have been specified, it will return an error,
@@ -235,7 +255,6 @@ mod tests {
235255 MILLIS_PER_SECOND , MINUTES_PER_HOUR , NANOS_PER_MICRO , NANOS_PER_MILLI , SECONDS_PER_MINUTE ,
236256 } ;
237257 use crate :: query:: { Timestamp , ValidQuery } ;
238- use chrono:: prelude:: { DateTime , TimeZone , Utc } ;
239258 use std:: convert:: TryInto ;
240259 #[ test]
241260 fn test_equality_str ( ) {
@@ -252,8 +271,10 @@ mod tests {
252271 fn test_format_for_timestamp_else ( ) {
253272 assert ! ( format!( "{}" , Timestamp :: Nanoseconds ( 100 ) ) == "100" ) ;
254273 }
274+ #[ cfg( feature = "chrono" ) ]
255275 #[ test]
256276 fn test_chrono_datetime_from_timestamp_hours ( ) {
277+ use chrono:: prelude:: * ;
257278 let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Hours ( 2 ) . into ( ) ;
258279 assert_eq ! (
259280 Utc . timestamp_nanos(
@@ -264,8 +285,10 @@ mod tests {
264285 datetime_from_timestamp
265286 )
266287 }
288+ #[ cfg( feature = "chrono" ) ]
267289 #[ test]
268290 fn test_chrono_datetime_from_timestamp_minutes ( ) {
291+ use chrono:: prelude:: * ;
269292 let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Minutes ( 2 ) . into ( ) ;
270293 assert_eq ! (
271294 Utc . timestamp_nanos(
@@ -276,8 +299,10 @@ mod tests {
276299 datetime_from_timestamp
277300 )
278301 }
302+ #[ cfg( feature = "chrono" ) ]
279303 #[ test]
280304 fn test_chrono_datetime_from_timestamp_seconds ( ) {
305+ use chrono:: prelude:: * ;
281306 let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Seconds ( 2 ) . into ( ) ;
282307 assert_eq ! (
283308 Utc . timestamp_nanos(
@@ -288,29 +313,37 @@ mod tests {
288313 datetime_from_timestamp
289314 )
290315 }
316+ #[ cfg( feature = "chrono" ) ]
291317 #[ test]
292318 fn test_chrono_datetime_from_timestamp_millis ( ) {
319+ use chrono:: prelude:: * ;
293320 let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Milliseconds ( 2 ) . into ( ) ;
294321 assert_eq ! (
295322 Utc . timestamp_nanos( ( 2 * NANOS_PER_MILLI ) . try_into( ) . unwrap( ) ) ,
296323 datetime_from_timestamp
297324 )
298325 }
326+ #[ cfg( feature = "chrono" ) ]
299327 #[ test]
300328 fn test_chrono_datetime_from_timestamp_nanos ( ) {
329+ use chrono:: prelude:: * ;
301330 let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Nanoseconds ( 1 ) . into ( ) ;
302331 assert_eq ! ( Utc . timestamp_nanos( 1 ) , datetime_from_timestamp)
303332 }
333+ #[ cfg( feature = "chrono" ) ]
304334 #[ test]
305335 fn test_chrono_datetime_from_timestamp_micros ( ) {
336+ use chrono:: prelude:: * ;
306337 let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Microseconds ( 2 ) . into ( ) ;
307338 assert_eq ! (
308339 Utc . timestamp_nanos( ( 2 * NANOS_PER_MICRO ) . try_into( ) . unwrap( ) ) ,
309340 datetime_from_timestamp
310341 )
311342 }
343+ #[ cfg( feature = "chrono" ) ]
312344 #[ test]
313345 fn test_timestamp_from_chrono_date ( ) {
346+ use chrono:: prelude:: * ;
314347 let timestamp_from_datetime: Timestamp = Utc
315348 . with_ymd_and_hms ( 1970 , 1 , 1 , 0 , 0 , 1 )
316349 . single ( )
0 commit comments