1use std::any::type_name_of_val;
2use std::sync::Arc;
3use async_trait::async_trait;
4use config::Config;
5use log::debug;
6use tokio::runtime::Runtime;
7use crate::core::Error;
8
9#[async_trait]
10pub trait Runner {
11 fn name(&self) -> &str {
12 let name = type_name_of_val(self);
13 match name.rsplit_once("::") {
14 None => name,
15 Some((_, name)) => name
16 }
17 }
18
19 fn runtime(&self, _config: Arc<Config>) -> Result<Runtime, Error> {
20 debug!("create tokio Runtime for {} runner", self.name());
21 tokio::runtime::Builder::new_multi_thread()
22 .thread_name(self.name().to_lowercase())
23 .enable_all()
24 .build()
25 .map_err(|_e| Error::from(format!("cannot initialize runtime for runner {}", self.name())))
26 }
27
28 async fn run(&self) -> Result<(), Error>;
29}