#![allow(dead_code)]
#![allow(clippy::borrowed_box)]
use crate::core::http::{Request, Response};
use crate::parking_lot::RwLock;
const ERR_STR: &str = "The context has not been initialized...";
static mut CONTEXT: Option<RwLock<Box<ServerContextProvider>>> = None;
pub type ServerContextProvider = ContextProvider + Sync + Send;
pub trait ContextProvider {
fn update(&mut self, req: &Box<Request>, resp: &mut Box<Response>) -> Result<(), &'static str>;
fn process(&self, req: &Box<Request>, resp: &mut Box<Response>) -> Result<(), &'static str>;
}
pub fn set_context(context: Box<ServerContextProvider>) {
if let Some(ctx) = unsafe { CONTEXT.as_mut() } {
let mut ctx = ctx.write();
*ctx = context;
return;
}
unsafe {
CONTEXT = Some(RwLock::new(context));
}
}
pub fn update_context(req: &Box<Request>, resp: &mut Box<Response>) -> Result<(), &'static str> {
if let Some(ctx) = unsafe { CONTEXT.as_mut() } {
let mut ctx = ctx.write();
return ctx.update(req, resp);
}
Err(ERR_STR)
}
pub fn process_with_context(
req: &Box<Request>,
resp: &mut Box<Response>,
) -> Result<(), &'static str> {
if let Some(ctx) = unsafe { CONTEXT.as_ref() } {
let ctx = ctx.read();
return ctx.process(req, resp);
}
Err(ERR_STR)
}