use std::convert::Infallible;
use std::future::Future;
use std::pin::Pin;
use std::task::Context;
use std::task::Poll;
use postgres_native_tls::MakeTlsConnector;
use bb8::Pool;
use bb8_postgres::PostgresConnectionManager;
use hyper::service::Service;
use hyper::Body;
use hyper::Request;
use hyper::Response;
use kafka_threadpool::kafka_publisher::KafkaPublisher;
use crate::core::core_config::CoreConfig;
use crate::core::server::core_http_request::CoreHttpRequest;
use crate::handle_request::handle_request;
use crate::tls::tls_info::TlsInfo;
#[derive(Clone)]
pub struct CoreServices {
pub config: CoreConfig,
pub db_pool: Pool<PostgresConnectionManager<MakeTlsConnector>>,
pub kafka_pool: KafkaPublisher,
pub local_addr: std::net::SocketAddr,
pub remote_addr: std::net::SocketAddr,
pub tls_info: Option<TlsInfo>,
}
impl Service<Request<Body>> for CoreServices {
type Response = Response<Body>;
type Error = Infallible;
type Future = Pin<
Box<
dyn Future<
Output = std::result::Result<Self::Response, Self::Error>,
> + Send,
>,
>;
fn poll_ready(
&mut self,
_cx: &mut Context<'_>,
) -> Poll<std::result::Result<(), Self::Error>> {
Poll::Ready(Ok(()))
}
fn call(&mut self, req: Request<Body>) -> Self::Future {
let data = CoreHttpRequest {
config: self.config.clone(),
db_pool: self.db_pool.clone(),
kafka_pool: self.kafka_pool.clone(),
local_addr: self.local_addr,
remote_addr: self.remote_addr,
tls_info: self.tls_info.clone(),
request: req,
response: Response::new("".into()),
};
Box::pin(handle_request(data))
}
}