tokio_easy_timer/
scheduler.rs1use chrono::TimeZone;
2
3use crate::extensions::Extensions;
4use crate::job::Job;
5
6pub type BoxedJob<Tz> = Box<dyn Job<Tz> + Send + 'static>;
7pub struct Scheduler<Tz = chrono::Local>
8where
9 Tz: chrono::TimeZone,
10{
11 jobs: Vec<BoxedJob<Tz>>,
12 tz: Tz,
13 extensions: Extensions,
14}
15
16impl Scheduler {
17 pub fn new() -> Scheduler {
27 Scheduler {
28 extensions: Extensions::default(),
29 jobs: vec![],
30 tz: chrono::Local,
31 }
32 }
33
34 pub fn with_tz<Tz: chrono::TimeZone>(tz: Tz) -> Scheduler<Tz> {
36 Scheduler {
37 extensions: Extensions::default(),
38 jobs: vec![],
39 tz,
40 }
41 }
42
43 }
48
49impl<Tz> Scheduler<Tz>
50where
51 Tz: TimeZone + Clone + Sync + Send + Copy + 'static,
52 <Tz as TimeZone>::Offset: Send + Sync,
53{
54 pub fn add_ext<T>(&self, ext: T)
56 where
57 T: 'static + Send + Sync,
58 {
59 self.extensions.insert(ext);
60 }
61
62 pub fn add(&mut self, job: BoxedJob<Tz>) -> &mut Scheduler<Tz> {
64 self.jobs.push(job);
65 self
66 }
67
68 async fn start_spawn(&self) -> &Self {
79 for job in self.jobs.iter() {
80 let e = self.extensions.clone();
81 let tz = self.tz.clone();
82 {
83 let job = job.box_clone();
84 tokio::spawn(async move {
85 let job = job;
86 job.start_schedule(e, tz);
87 });
88 }
89 }
90 self
91 }
92
93 pub async fn run(&self) -> &Self {
95 self.start_spawn().await
96 }
97
98 pub async fn run_pending(&self) {
100 self.start_spawn().await;
101 std::future::pending::<()>().await;
102 }
103}