use crate::{NetworkProvider, RandomProvider, StorageProvider, TaskProvider, TimeProvider};
#[cfg(feature = "tokio-providers")]
use crate::{
TokioNetworkProvider, TokioRandomProvider, TokioStorageProvider, TokioTaskProvider,
TokioTimeProvider,
};
#[doc(hidden)]
#[macro_export]
macro_rules! impl_providers_bundle {
(
$struct:ty {
network: $network_ty:ty,
time: $time_ty:ty,
task: $task_ty:ty,
random: $random_ty:ty,
storage: $storage_ty:ty $(,)?
}
) => {
impl $crate::Providers for $struct {
type Network = $network_ty;
type Time = $time_ty;
type Task = $task_ty;
type Random = $random_ty;
type Storage = $storage_ty;
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
}
fn storage(&self) -> &Self::Storage {
&self.storage
}
}
};
}
pub trait Providers: Clone + Send + Sync + 'static {
type Network: NetworkProvider;
type Time: TimeProvider;
type Task: TaskProvider;
type Random: RandomProvider;
type Storage: StorageProvider;
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;
}
#[cfg(feature = "tokio-providers")]
#[derive(Clone)]
pub struct TokioProviders {
network: TokioNetworkProvider,
time: TokioTimeProvider,
task: TokioTaskProvider,
random: TokioRandomProvider,
storage: TokioStorageProvider,
}
#[cfg(feature = "tokio-providers")]
impl TokioProviders {
#[must_use]
pub fn new() -> Self {
Self {
network: TokioNetworkProvider::new(),
time: TokioTimeProvider::new(),
task: TokioTaskProvider,
random: TokioRandomProvider::new(),
storage: TokioStorageProvider::new(),
}
}
}
#[cfg(feature = "tokio-providers")]
impl Default for TokioProviders {
fn default() -> Self {
Self::new()
}
}
#[cfg(feature = "tokio-providers")]
impl_providers_bundle!(TokioProviders {
network: TokioNetworkProvider,
time: TokioTimeProvider,
task: TokioTaskProvider,
random: TokioRandomProvider,
storage: TokioStorageProvider,
});