|
|
@ -1,9 +1,11 @@ |
|
|
|
use crate::async_utils::sleep;
|
|
|
|
use crate::loggers::Logger;
|
|
|
|
use crate::symbols::Symbol;
|
|
|
|
use async_trait::async_trait;
|
|
|
|
use std::error::Error;
|
|
|
|
use std::fmt;
|
|
|
|
use std::fmt::Debug;
|
|
|
|
use std::time::Duration;
|
|
|
|
|
|
|
|
#[async_trait(?Send)]
|
|
|
|
pub trait SymbolRunner {
|
|
|
@ -96,6 +98,41 @@ impl SymbolRunner for InitializingSymbolRunner { |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
|
|
|
pub struct DelayingSymbolRunner<R>(R);
|
|
|
|
|
|
|
|
impl<R> DelayingSymbolRunner<R> {
|
|
|
|
pub fn new(symbol_runner: R) -> Self {
|
|
|
|
Self(symbol_runner)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[async_trait(?Send)]
|
|
|
|
impl<R> SymbolRunner for DelayingSymbolRunner<R>
|
|
|
|
where
|
|
|
|
R: SymbolRunner,
|
|
|
|
{
|
|
|
|
async fn run_symbol<S: Symbol + Debug, L: Logger>(
|
|
|
|
&self,
|
|
|
|
symbol: &S,
|
|
|
|
logger: &L,
|
|
|
|
force: bool,
|
|
|
|
) -> Result<bool, Box<dyn Error>> {
|
|
|
|
sleep(Duration::from_millis(
|
|
|
|
(((std::time::SystemTime::now()
|
|
|
|
.duration_since(std::time::UNIX_EPOCH)
|
|
|
|
.unwrap()
|
|
|
|
.subsec_micros()
|
|
|
|
% 20) as f32
|
|
|
|
/ 2.0)
|
|
|
|
.exp()
|
|
|
|
/ 8.0) as u64,
|
|
|
|
))
|
|
|
|
.await;
|
|
|
|
self.0.run_symbol(symbol, logger, force).await
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, Default)]
|
|
|
|
pub struct DrySymbolRunner;
|
|
|
|
|
|
|
|