use crate::{
handler::handler::{Handler, HandlerFactory},
utils::Context,
};
pub mod file;
mod handler;
pub mod proxy;
type Factory = fn(&Context) -> Option<Box<dyn Handler>>;
static HANDLERS: &[Factory] = &[proxy::ProxyHandler::is, file::FileHandler::is];
pub struct HandlerEngine {
handlers: Vec<Factory>,
}
impl HandlerEngine {
pub fn new() -> HandlerEngine {
let mut handlers = Vec::new();
handlers.extend_from_slice(HANDLERS);
HandlerEngine { handlers }
}
pub fn add_handler(&mut self, handler: Factory) {
self.handlers.insert(0, handler);
}
pub fn get_handler(&self, ctx: &Context) -> Option<Box<dyn Handler>> {
for h in self.handlers.iter() {
if let Some(handler) = h(ctx) {
return Some(handler);
}
}
None
}
}