use crate::*;
impl Default for Context {
#[inline(always)]
fn default() -> Self {
Self {
request: Request::default(),
response: Response::default(),
route_params: RouteParams::default(),
attributes: ThreadSafeAttributeStore::default(),
}
}
}
impl PartialEq for Context {
#[inline(always)]
fn eq(&self, other: &Self) -> bool {
self.get_request() == other.get_request()
&& self.get_response() == other.get_response()
&& self.get_route_params() == other.get_route_params()
&& self.get_attributes().len() == other.get_attributes().len()
}
}
impl Eq for Context {}
impl From<usize> for &'static Context {
#[inline(always)]
fn from(address: usize) -> &'static Context {
unsafe { &*(address as *const Context) }
}
}
impl<'a> From<usize> for &'a mut Context {
#[inline(always)]
fn from(address: usize) -> &'a mut Context {
unsafe { &mut *(address as *mut Context) }
}
}
impl From<&Context> for usize {
#[inline(always)]
fn from(ctx: &Context) -> Self {
ctx as *const Context as usize
}
}
impl From<&mut Context> for usize {
#[inline(always)]
fn from(ctx: &mut Context) -> Self {
ctx as *mut Context as usize
}
}
impl AsRef<Context> for Context {
#[inline(always)]
fn as_ref(&self) -> &Self {
let address: usize = self.into();
address.into()
}
}
impl AsMut<Context> for Context {
#[inline(always)]
fn as_mut(&mut self) -> &mut Self {
let address: usize = self.into();
address.into()
}
}
impl Lifetime for Context {
#[inline(always)]
unsafe fn leak(&self) -> &'static Self {
let address: usize = self.into();
address.into()
}
#[inline(always)]
unsafe fn leak_mut(&self) -> &'static mut Self {
let address: usize = self.into();
address.into()
}
}
impl Context {
#[inline(always)]
pub fn try_get_route_param<T>(&self, name: T) -> Option<String>
where
T: AsRef<str>,
{
self.get_route_params().get(name.as_ref()).cloned()
}
#[inline(always)]
pub fn get_route_param<T>(&self, name: T) -> String
where
T: AsRef<str>,
{
self.try_get_route_param(name).unwrap()
}
#[inline(always)]
pub fn try_get_attribute<V>(&self, key: impl AsRef<str>) -> Option<V>
where
V: AnySendSyncClone,
{
self.get_attributes()
.get(&Attribute::External(key.as_ref().to_owned()).to_string())
.and_then(|arc| arc.downcast_ref::<V>())
.cloned()
}
#[inline(always)]
pub fn get_attribute<V>(&self, key: impl AsRef<str>) -> V
where
V: AnySendSyncClone,
{
self.try_get_attribute(key).unwrap()
}
#[inline(always)]
pub fn set_attribute<K, V>(&mut self, key: K, value: V) -> &mut Self
where
K: AsRef<str>,
V: AnySendSyncClone,
{
self.get_mut_attributes().insert(
Attribute::External(key.as_ref().to_owned()).to_string(),
Arc::new(value),
);
self
}
#[inline(always)]
pub fn remove_attribute<K>(&mut self, key: K) -> &mut Self
where
K: AsRef<str>,
{
self.get_mut_attributes()
.remove(&Attribute::External(key.as_ref().to_owned()).to_string());
self
}
#[inline(always)]
pub fn clear_attribute(&mut self) -> &mut Self {
self.get_mut_attributes().clear();
self
}
#[inline(always)]
fn try_get_internal_attribute<V>(&self, key: InternalAttribute) -> Option<V>
where
V: AnySendSyncClone,
{
self.get_attributes()
.get(&Attribute::Internal(key).to_string())
.and_then(|arc| arc.downcast_ref::<V>())
.cloned()
}
#[inline(always)]
fn get_internal_attribute<V>(&self, key: InternalAttribute) -> V
where
V: AnySendSyncClone,
{
self.try_get_internal_attribute(key).unwrap()
}
#[inline(always)]
fn set_internal_attribute<V>(&mut self, key: InternalAttribute, value: V) -> &mut Self
where
V: AnySendSyncClone,
{
self.get_mut_attributes()
.insert(Attribute::Internal(key).to_string(), Arc::new(value));
self
}
#[inline(always)]
pub(crate) fn set_task_panic(&mut self, panic_data: PanicData) -> &mut Self {
self.set_internal_attribute(InternalAttribute::TaskPanicData, panic_data)
}
#[inline(always)]
pub fn try_get_task_panic_data(&self) -> Option<PanicData> {
self.try_get_internal_attribute(InternalAttribute::TaskPanicData)
}
#[inline(always)]
pub fn get_task_panic_data(&self) -> PanicData {
self.get_internal_attribute(InternalAttribute::TaskPanicData)
}
#[inline(always)]
pub(crate) fn set_request_error_data(&mut self, request_error: RequestError) -> &mut Self {
self.set_internal_attribute(InternalAttribute::RequestErrorData, request_error)
}
#[inline(always)]
pub fn try_get_request_error_data(&self) -> Option<RequestError> {
self.try_get_internal_attribute(InternalAttribute::RequestErrorData)
}
#[inline(always)]
pub fn get_request_error_data(&self) -> RequestError {
self.get_internal_attribute(InternalAttribute::RequestErrorData)
}
}