20
20
//! assert!(read_query.is_ok());
21
21
//! ```
22
22
23
- use chrono:: prelude:: { DateTime , TimeZone , Utc } ;
24
- use std:: convert:: TryInto ;
25
-
26
23
pub mod consts;
27
24
mod line_proto_term;
28
25
pub mod read_query;
@@ -47,6 +44,21 @@ pub enum Timestamp {
47
44
Hours ( u128 ) ,
48
45
}
49
46
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
+
50
62
impl fmt:: Display for Timestamp {
51
63
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
52
64
use Timestamp :: * ;
@@ -57,44 +69,52 @@ impl fmt::Display for Timestamp {
57
69
}
58
70
}
59
71
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 )
86
77
}
87
78
}
88
79
89
- impl < T > From < DateTime < T > > for Timestamp
80
+ #[ cfg( feature = "chrono" ) ]
81
+ impl < T > From < chrono:: DateTime < T > > for Timestamp
90
82
where
91
- T : TimeZone ,
83
+ T : chrono :: TimeZone ,
92
84
{
93
- fn from ( date_time : DateTime < T > ) -> Self {
85
+ fn from ( date_time : chrono :: DateTime < T > ) -> Self {
94
86
Timestamp :: Nanoseconds ( date_time. timestamp_nanos_opt ( ) . unwrap ( ) as u128 )
95
87
}
96
88
}
97
89
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
+
98
118
pub trait Query {
99
119
/// Builds valid InfluxSQL which can be run against the Database.
100
120
/// In case no fields have been specified, it will return an error,
@@ -235,7 +255,6 @@ mod tests {
235
255
MILLIS_PER_SECOND , MINUTES_PER_HOUR , NANOS_PER_MICRO , NANOS_PER_MILLI , SECONDS_PER_MINUTE ,
236
256
} ;
237
257
use crate :: query:: { Timestamp , ValidQuery } ;
238
- use chrono:: prelude:: { DateTime , TimeZone , Utc } ;
239
258
use std:: convert:: TryInto ;
240
259
#[ test]
241
260
fn test_equality_str ( ) {
@@ -252,8 +271,10 @@ mod tests {
252
271
fn test_format_for_timestamp_else ( ) {
253
272
assert ! ( format!( "{}" , Timestamp :: Nanoseconds ( 100 ) ) == "100" ) ;
254
273
}
274
+ #[ cfg( feature = "chrono" ) ]
255
275
#[ test]
256
276
fn test_chrono_datetime_from_timestamp_hours ( ) {
277
+ use chrono:: prelude:: * ;
257
278
let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Hours ( 2 ) . into ( ) ;
258
279
assert_eq ! (
259
280
Utc . timestamp_nanos(
@@ -264,8 +285,10 @@ mod tests {
264
285
datetime_from_timestamp
265
286
)
266
287
}
288
+ #[ cfg( feature = "chrono" ) ]
267
289
#[ test]
268
290
fn test_chrono_datetime_from_timestamp_minutes ( ) {
291
+ use chrono:: prelude:: * ;
269
292
let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Minutes ( 2 ) . into ( ) ;
270
293
assert_eq ! (
271
294
Utc . timestamp_nanos(
@@ -276,8 +299,10 @@ mod tests {
276
299
datetime_from_timestamp
277
300
)
278
301
}
302
+ #[ cfg( feature = "chrono" ) ]
279
303
#[ test]
280
304
fn test_chrono_datetime_from_timestamp_seconds ( ) {
305
+ use chrono:: prelude:: * ;
281
306
let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Seconds ( 2 ) . into ( ) ;
282
307
assert_eq ! (
283
308
Utc . timestamp_nanos(
@@ -288,29 +313,37 @@ mod tests {
288
313
datetime_from_timestamp
289
314
)
290
315
}
316
+ #[ cfg( feature = "chrono" ) ]
291
317
#[ test]
292
318
fn test_chrono_datetime_from_timestamp_millis ( ) {
319
+ use chrono:: prelude:: * ;
293
320
let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Milliseconds ( 2 ) . into ( ) ;
294
321
assert_eq ! (
295
322
Utc . timestamp_nanos( ( 2 * NANOS_PER_MILLI ) . try_into( ) . unwrap( ) ) ,
296
323
datetime_from_timestamp
297
324
)
298
325
}
326
+ #[ cfg( feature = "chrono" ) ]
299
327
#[ test]
300
328
fn test_chrono_datetime_from_timestamp_nanos ( ) {
329
+ use chrono:: prelude:: * ;
301
330
let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Nanoseconds ( 1 ) . into ( ) ;
302
331
assert_eq ! ( Utc . timestamp_nanos( 1 ) , datetime_from_timestamp)
303
332
}
333
+ #[ cfg( feature = "chrono" ) ]
304
334
#[ test]
305
335
fn test_chrono_datetime_from_timestamp_micros ( ) {
336
+ use chrono:: prelude:: * ;
306
337
let datetime_from_timestamp: DateTime < Utc > = Timestamp :: Microseconds ( 2 ) . into ( ) ;
307
338
assert_eq ! (
308
339
Utc . timestamp_nanos( ( 2 * NANOS_PER_MICRO ) . try_into( ) . unwrap( ) ) ,
309
340
datetime_from_timestamp
310
341
)
311
342
}
343
+ #[ cfg( feature = "chrono" ) ]
312
344
#[ test]
313
345
fn test_timestamp_from_chrono_date ( ) {
346
+ use chrono:: prelude:: * ;
314
347
let timestamp_from_datetime: Timestamp = Utc
315
348
. with_ymd_and_hms ( 1970 , 1 , 1 , 0 , 0 , 1 )
316
349
. single ( )
0 commit comments