@@ -10,7 +10,7 @@ use rand::{thread_rng, Rng};
10
10
use serde:: ser:: SerializeStruct ;
11
11
use serde:: { Serialize , Serializer } ;
12
12
13
- use chrono:: { Duration , Local } ;
13
+ use chrono:: { DateTime , Duration , Local } ;
14
14
15
15
const REDIS_URL_ENV : & str = "REDIS_URL" ;
16
16
const REDIS_URL_DEFAULT : & str = "redis://127.0.0.1/" ;
@@ -201,16 +201,16 @@ impl Client {
201
201
}
202
202
}
203
203
204
- fn calc_at ( & self , interval : Duration ) -> Option < f64 > {
204
+ fn calc_at ( & self , target_millsec_number : f64 ) -> Option < f64 > {
205
205
let div: f64 = 1_000_f64 ;
206
- let maximum_interval : f64 = 1_000_000_000_f64 ;
207
- let interval_millsec : f64 = interval . num_milliseconds ( ) as f64 / div;
206
+ let maximum_target : f64 = 1_000_000_000_f64 ;
207
+ let target_millsec : f64 = target_millsec_number / div;
208
208
let now_millisec: f64 = Local :: now ( ) . timestamp_millis ( ) as f64 / div;
209
209
210
- let start_at: f64 = if interval_millsec < maximum_interval {
211
- now_millisec + interval_millsec
210
+ let start_at: f64 = if target_millsec < maximum_target {
211
+ now_millisec + target_millsec
212
212
} else {
213
- interval_millsec
213
+ target_millsec
214
214
} ;
215
215
216
216
if start_at <= now_millisec {
@@ -220,8 +220,22 @@ impl Client {
220
220
}
221
221
}
222
222
223
+ fn convert_duration_to_millsec ( & self , interval : Duration ) -> Option < f64 > {
224
+ let interval_millsec: f64 = interval. num_milliseconds ( ) as f64 ;
225
+ self . calc_at ( interval_millsec)
226
+ }
227
+
228
+ fn convert_datetime_to_millsec ( & self , datetime : DateTime < Local > ) -> Option < f64 > {
229
+ let timestamp_millsec: f64 = datetime. timestamp_millis ( ) as f64 ;
230
+ self . calc_at ( timestamp_millsec)
231
+ }
232
+
223
233
pub fn perform_in ( & self , interval : Duration , job : Job ) -> Result < ( ) , ClientError > {
224
- self . raw_push ( & [ job] , self . calc_at ( interval) )
234
+ self . raw_push ( & [ job] , self . convert_duration_to_millsec ( interval) )
235
+ }
236
+
237
+ pub fn perform_at ( & self , local_datetime : DateTime < Local > , job : Job ) -> Result < ( ) , ClientError > {
238
+ self . raw_push ( & [ job] , self . convert_datetime_to_millsec ( local_datetime) )
225
239
}
226
240
227
241
pub fn push ( & self , job : Job ) -> Result < ( ) , ClientError > {
0 commit comments