use std::sync::Arc;
use crate::Result;
use super::{ErrorHandler, Handler, HttpServer, HttpSettings, ResponseData, respond};
#[cfg(feature = "tls")]
use super::TlsConfigProvider;
#[derive(Clone, Debug)]
pub struct HttpServerBuilder {
addr: String,
settings: HttpSettings,
handler: Handler,
error_handler: ErrorHandler,
#[cfg(feature = "tls")]
tls_config: Option<TlsConfigProvider>,
}
impl Default for HttpServerBuilder {
fn default() -> Self {
Self::new()
}
}
impl HttpServerBuilder {
pub fn new() -> Self {
Self {
addr: "localhost:8080".to_string(),
settings: HttpSettings::default(),
handler: |_| unimplemented!(),
error_handler: |err| {
respond(
err.to_string(),
"text/plain",
ResponseData::internal_server_error().build(),
)
},
#[cfg(feature = "tls")]
tls_config: None,
}
}
pub fn addr(mut self, addr: impl ToString) -> Self {
self.addr = addr.to_string();
self
}
pub fn settings(mut self, settings: HttpSettings) -> Self {
self.settings = settings;
self
}
#[cfg(feature = "tls")]
pub fn tls(mut self, tls_config: Option<TlsConfigProvider>) -> Self {
self.tls_config = tls_config;
self
}
#[cfg(feature = "tls")]
pub fn tls_on(self, tls_config: TlsConfigProvider) -> Self {
self.tls(Some(tls_config))
}
#[cfg(feature = "tls")]
pub fn tls_off(self) -> Self {
self.tls(None)
}
pub fn handler(mut self, handler: Handler) -> Self {
self.handler = handler;
self
}
pub fn error_handler(mut self, error_handler: ErrorHandler) -> Self {
self.error_handler = error_handler;
self
}
pub fn build(self) -> Result<Arc<HttpServer>> {
HttpServer::new(
self.addr,
Arc::new(self.settings),
self.handler,
self.error_handler,
#[cfg(feature = "tls")]
self.tls_config,
)
}
}