use crate::*;
impl<F, R> FnContext<R> for F where F: Fn(&mut Context) -> R + Send + Sync {}
impl<F, T> FnContextPinBox<T> for F where F: FnContext<FutureBox<T>> {}
impl<F, Fut, T> FnContextStatic<Fut, T> for F
where
F: FnContext<Fut> + 'static,
Fut: Future<Output = T> + Send,
{
}
impl<T, R> FutureSendStatic<R> for T where T: Future<Output = R> + Send + 'static {}
impl<T, O> FutureSend<O> for T where T: Future<Output = O> + Send {}
impl<T, O> FutureFn<O> for T where T: Fn() -> FutureBox<O> + Send + Sync {}
impl Default for ServerControlHook {
#[inline(always)]
fn default() -> Self {
Self {
wait_hook: default_server_control_hook_handler(),
shutdown_hook: default_server_control_hook_handler(),
}
}
}
impl ServerControlHook {
pub async fn wait(&self) {
self.get_wait_hook()().await;
}
pub async fn shutdown(&self) {
self.get_shutdown_hook()().await;
}
}
impl PartialEq for HookType {
#[inline(always)]
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(HookType::TaskPanic(order1, factory1), HookType::TaskPanic(order2, factory2)) => {
order1 == order2 && std::ptr::fn_addr_eq(*factory1, *factory2)
}
(
HookType::RequestError(order1, factory1),
HookType::RequestError(order2, factory2),
) => order1 == order2 && std::ptr::fn_addr_eq(*factory1, *factory2),
(
HookType::RequestMiddleware(order1, factory1),
HookType::RequestMiddleware(order2, factory2),
) => order1 == order2 && std::ptr::fn_addr_eq(*factory1, *factory2),
(HookType::Route(path1, factory1), HookType::Route(path2, factory2)) => {
path1 == path2 && std::ptr::fn_addr_eq(*factory1, *factory2)
}
(
HookType::ResponseMiddleware(order1, factory1),
HookType::ResponseMiddleware(order2, factory2),
) => order1 == order2 && std::ptr::fn_addr_eq(*factory1, *factory2),
_ => false,
}
}
}
impl Eq for HookType {}
impl Hash for HookType {
#[inline]
fn hash<H: Hasher>(&self, state: &mut H) {
match self {
HookType::TaskPanic(order, factory) => {
0u8.hash(state);
order.hash(state);
(factory as *const fn() -> ServerHookHandler).hash(state);
}
HookType::RequestError(order, factory) => {
1u8.hash(state);
order.hash(state);
(factory as *const fn() -> ServerHookHandler).hash(state);
}
HookType::RequestMiddleware(order, factory) => {
2u8.hash(state);
order.hash(state);
(factory as *const fn() -> ServerHookHandler).hash(state);
}
HookType::Route(path, factory) => {
3u8.hash(state);
path.hash(state);
(factory as *const fn() -> ServerHookHandler).hash(state);
}
HookType::ResponseMiddleware(order, factory) => {
4u8.hash(state);
order.hash(state);
(factory as *const fn() -> ServerHookHandler).hash(state);
}
}
}
}
impl HookType {
#[inline(always)]
pub fn try_get_order(&self) -> Option<isize> {
match *self {
HookType::RequestMiddleware(order, _)
| HookType::ResponseMiddleware(order, _)
| HookType::TaskPanic(order, _)
| HookType::RequestError(order, _) => order,
_ => None,
}
}
#[inline(always)]
pub fn try_get_hook(&self) -> Option<ServerHookHandlerFactory> {
match *self {
HookType::RequestMiddleware(_, hook)
| HookType::ResponseMiddleware(_, hook)
| HookType::TaskPanic(_, hook)
| HookType::RequestError(_, hook) => Some(hook),
_ => None,
}
}
}
impl ServerHook for DefaultServerHook {
async fn new(_: &mut Context) -> Self {
Self
}
async fn handle(self, _: &mut Context) {}
}