use std::sync::Arc;
use crate::Env;
use crate::env::EnvImpl;
pub trait Platform: Send + Sync {
fn env(&self) -> &(impl Env + use<Self>);
#[cfg(feature = "fs")]
fn fs(&self) -> &(impl crate::Fs + use<Self>);
#[cfg(feature = "process")]
fn process(&self) -> &(impl crate::Process + use<Self>);
#[cfg(feature = "request")]
fn request(&self) -> &(impl crate::Request + use<Self>);
}
pub(crate) struct PlatformImpl {
pub(crate) env: EnvImpl,
#[cfg(feature = "fs")]
pub(crate) fs: crate::fs::FsImpl,
#[cfg(feature = "process")]
pub(crate) process: crate::process::ProcessImpl,
#[cfg(feature = "request")]
pub(crate) request: crate::request::RequestImpl,
}
impl Platform for PlatformImpl {
fn env(&self) -> &(impl Env + use<>) {
&self.env
}
#[cfg(feature = "fs")]
fn fs(&self) -> &(impl crate::Fs + use<>) {
&self.fs
}
#[cfg(feature = "process")]
fn process(&self) -> &(impl crate::Process + use<>) {
&self.process
}
#[cfg(feature = "request")]
fn request(&self) -> &(impl crate::Request + use<>) {
&self.request
}
}
impl<P: Platform> Platform for Arc<P> {
fn env(&self) -> &(impl Env + use<P>) {
(**self).env()
}
#[cfg(feature = "fs")]
fn fs(&self) -> &(impl crate::Fs + use<P>) {
(**self).fs()
}
#[cfg(feature = "process")]
fn process(&self) -> &(impl crate::Process + use<P>) {
(**self).process()
}
#[cfg(feature = "request")]
fn request(&self) -> &(impl crate::Request + use<P>) {
(**self).request()
}
}