use crate::{
support::Context,
config::{LoadBalancer, RouteAddr},
};
use gateway_common::FusenFuture;
use std::{str::FromStr, sync::Arc};
pub trait RequestHandler_: Send + Sync {
fn handler_(&'static self, context: Context, config: Option<String>) -> FusenFuture<Context>;
}
#[allow(async_fn_in_trait)]
pub trait RequestHandler {
async fn handler(&self, context: Context, config: Option<String>) -> Context;
}
pub trait ResponseHandler_: Send + Sync {
fn handler_(&'static self, context: Context, config: Option<String>) -> FusenFuture<Context>;
}
#[allow(async_fn_in_trait)]
pub trait ResponseHandler {
async fn handler(&self, context: Context, config: Option<String>) -> Context;
}
pub trait BaseHandler_: Send + Sync {
fn handler_(&'static self, context: Context, config: Option<String>) -> FusenFuture<Context>;
}
#[allow(async_fn_in_trait)]
pub trait BaseHandler {
async fn handler(&self, context: Context, config: Option<String>) -> Context;
}
pub trait LoadBalance_: Send + Sync {
fn select_(
&'static self,
load_balancer: Arc<LoadBalancer>,
) -> FusenFuture<Option<Arc<RouteAddr>>>;
}
#[allow(async_fn_in_trait)]
pub trait LoadBalance {
async fn select(&self, addrs: Vec<Arc<RouteAddr>>) -> Option<Arc<RouteAddr>>;
}
pub enum HandlerInvoker {
RequestHandler(&'static dyn RequestHandler_),
ResponseHandler(&'static dyn ResponseHandler_),
BaseHandler(&'static dyn BaseHandler_),
LoadBalance(&'static dyn LoadBalance_),
}
pub struct Handler {
id: String,
handler_invoker: HandlerInvoker,
}
pub trait HandlerLoad {
fn load(self) -> Handler;
}
impl Handler {
pub fn new(id: String, handler_invoker: HandlerInvoker) -> Self {
Self {
id,
handler_invoker,
}
}
pub fn get_key(&self) -> String {
let mut key = String::from_str(&self.id).unwrap();
match &self.handler_invoker {
HandlerInvoker::RequestHandler(_) => key.push_str(":RequestHandler"),
HandlerInvoker::ResponseHandler(_) => key.push_str(":ResponseHandler"),
HandlerInvoker::BaseHandler(_) => key.push_str(":BaseHandler"),
HandlerInvoker::LoadBalance(_) => key.push_str(":LoadBalance"),
}
key
}
pub fn get_request_handler(&self) -> Option<&'static dyn RequestHandler_> {
if let HandlerInvoker::RequestHandler(handler) = self.handler_invoker {
Some(handler)
} else {
None
}
}
pub fn get_response_handler(&self) -> Option<&'static dyn ResponseHandler_> {
if let HandlerInvoker::ResponseHandler(handler) = self.handler_invoker {
Some(handler)
} else {
None
}
}
pub fn get_base_handler(&self) -> Option<&'static dyn BaseHandler_> {
if let HandlerInvoker::BaseHandler(handler) = self.handler_invoker {
Some(handler)
} else {
None
}
}
}