use std::sync::Arc;
use super::{ExtractError, FromMessageRequest, MessageRequest, Payload};
#[derive(Clone)]
pub struct SharedState<T: Send + Sync>(Arc<T>);
impl<T: Send + Sync> std::fmt::Debug for SharedState<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SharedState").finish_non_exhaustive()
}
}
impl<T: Send + Sync> From<Arc<T>> for SharedState<T> {
fn from(inner: Arc<T>) -> Self { Self(inner) }
}
impl<T: Send + Sync> From<T> for SharedState<T> {
fn from(inner: T) -> Self { Self(Arc::new(inner)) }
}
impl<T> FromMessageRequest for SharedState<T>
where
T: Send + Sync + 'static,
{
type Error = ExtractError;
fn from_message_request(
req: &MessageRequest,
_payload: &mut Payload<'_>,
) -> Result<Self, Self::Error> {
req.state::<T>()
.ok_or(ExtractError::MissingState(std::any::type_name::<T>()))
}
}
impl<T: Send + Sync> std::ops::Deref for SharedState<T> {
type Target = T;
fn deref(&self) -> &Self::Target { &self.0 }
}