use std::{marker::PhantomData, sync::MutexGuard};
use super::super::domains::{RequestContext, SharedRequestContext};
use super::super::RequestContextError;
use crate::executor::hooks::HookMarker;
impl SharedRequestContext {
pub fn for_plugin<Hook: HookMarker>(&self) -> RequestContextPluginApi<Hook> {
RequestContextPluginApi::new(self.clone())
}
}
#[derive(Clone)]
pub struct RequestContextPluginApi<Hook> {
context: SharedRequestContext,
_hook: PhantomData<Hook>,
}
pub struct RequestContextPluginRead<Hook> {
pub(crate) snapshot: RequestContext,
pub(crate) _hook: PhantomData<Hook>,
}
pub struct RequestContextPluginWrite<'a, Hook> {
pub(crate) context: MutexGuard<'a, RequestContext>,
pub(crate) _hook: PhantomData<Hook>,
}
impl<Hook: HookMarker> RequestContextPluginApi<Hook> {
fn new(context: SharedRequestContext) -> RequestContextPluginApi<Hook> {
RequestContextPluginApi {
context,
_hook: PhantomData,
}
}
pub fn read(&self) -> Result<RequestContextPluginRead<Hook>, RequestContextError> {
Ok(RequestContextPluginRead {
snapshot: self.context.snapshot()?,
_hook: PhantomData,
})
}
pub fn write(&self) -> Result<RequestContextPluginWrite<'_, Hook>, RequestContextError> {
Ok(RequestContextPluginWrite {
context: self.context.read_lock()?,
_hook: PhantomData,
})
}
}