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}