mate/
lib.rs

1pub mod client;
2pub mod executor;
3pub mod job;
4pub mod repl;
5pub mod scheduler;
6
7use std::sync::Arc;
8use std::time::Duration;
9
10use anyhow::Result;
11use repl::Repl;
12
13use self::client::Client;
14use self::executor::Executor;
15use self::scheduler::{Scheduler, SchedulerBackend};
16
17pub struct Mate<SB: SchedulerBackend> {
18    pub client: Arc<Client<SB>>,
19    pub repl: Repl<SB>,
20}
21
22impl<SB: SchedulerBackend> Mate<SB> {
23    pub fn new(scheduler: Scheduler<SB>, threshold: Duration) -> Self {
24        let scheduler = Arc::new(scheduler);
25        let executor = Executor::new(Arc::clone(&scheduler), threshold);
26        let client = Arc::new(Client::new(executor, scheduler));
27        let repl = Repl::new(Arc::clone(&client));
28
29        Self { client, repl }
30    }
31
32    pub async fn repl(&self) -> Result<()> {
33        self.repl.start().await
34    }
35
36    pub async fn run(&self) -> Result<()> {
37        let executor = Arc::clone(&self.client.executor);
38        tokio::spawn(async move {
39            if let Err(err) = executor.run().await {
40                eprintln!("Executor error: {:?}", err);
41            }
42        })
43        .await?;
44
45        Ok(())
46    }
47}