use crate::{
NetworkProvider, RandomProvider, StorageProvider, TaskProvider, TimeProvider,
TokioNetworkProvider, TokioRandomProvider, TokioStorageProvider, TokioTaskProvider,
TokioTimeProvider,
};
pub trait Providers: Clone + 'static {
type Network: NetworkProvider + Clone + 'static;
type Time: TimeProvider + Clone + 'static;
type Task: TaskProvider + Clone + 'static;
type Random: RandomProvider + Clone + 'static;
type Storage: StorageProvider + Clone + 'static;
fn network(&self) -> &Self::Network;
fn time(&self) -> &Self::Time;
fn task(&self) -> &Self::Task;
fn random(&self) -> &Self::Random;
fn storage(&self) -> &Self::Storage;
}
#[derive(Clone)]
pub struct TokioProviders {
network: TokioNetworkProvider,
time: TokioTimeProvider,
task: TokioTaskProvider,
random: TokioRandomProvider,
storage: TokioStorageProvider,
}
impl TokioProviders {
pub fn new() -> Self {
Self {
network: TokioNetworkProvider::new(),
time: TokioTimeProvider::new(),
task: TokioTaskProvider,
random: TokioRandomProvider::new(),
storage: TokioStorageProvider::new(),
}
}
}
impl Default for TokioProviders {
fn default() -> Self {
Self::new()
}
}
impl Providers for TokioProviders {
type Network = TokioNetworkProvider;
type Time = TokioTimeProvider;
type Task = TokioTaskProvider;
type Random = TokioRandomProvider;
fn network(&self) -> &Self::Network {
&self.network
}
fn time(&self) -> &Self::Time {
&self.time
}
fn task(&self) -> &Self::Task {
&self.task
}
fn random(&self) -> &Self::Random {
&self.random
}
type Storage = TokioStorageProvider;
fn storage(&self) -> &Self::Storage {
&self.storage
}
}