#![forbid(unsafe_code)]
#![forbid(missing_docs)]
pub mod err;
cfg_if::cfg_if! {
if #[cfg(feature = "ossl")] {
mod ossl;
use crate::ossl::SslImpl;
} else {
mod rtls;
use crate::rtls::SslImpl;
}
}
mod running;
mod ssl;
use crate::err::Error;
pub use crate::ssl::SslConfig;
pub use mailin::response;
pub use mailin::{Action, AuthMechanism, Handler, Response};
use std::net::{SocketAddr, TcpListener, ToSocketAddrs};
pub struct Server<H>
where
H: Handler + Clone + Send,
{
handler: H,
name: String,
ssl: Option<SslImpl>,
num_threads: u32,
auth: Vec<AuthMechanism>,
tcp_listener: Option<TcpListener>,
socket_address: Vec<SocketAddr>,
}
impl<H> Server<H>
where
H: Handler + Clone + Send,
{
pub fn new(handler: H) -> Self {
Self {
handler,
name: "localhost".to_owned(),
ssl: None,
num_threads: 4,
auth: Vec::with_capacity(4),
tcp_listener: None,
socket_address: Vec::with_capacity(4),
}
}
pub fn with_name<T>(&mut self, name: T) -> &mut Self
where
T: Into<String>,
{
self.name = name.into();
self
}
pub fn with_ssl(&mut self, ssl_config: SslConfig) -> Result<&mut Self, Error> {
self.ssl = SslImpl::setup(ssl_config)?;
Ok(self)
}
pub fn with_num_threads(&mut self, num_threads: u32) -> &mut Self {
self.num_threads = num_threads;
self
}
pub fn with_auth(&mut self, auth: AuthMechanism) -> &mut Self {
self.auth.push(auth);
self
}
pub fn with_tcp_listener(&mut self, listener: TcpListener) -> &mut Self {
self.tcp_listener = Some(listener);
self
}
pub fn with_addr<A: ToSocketAddrs>(&mut self, addr: A) -> Result<&mut Self, Error> {
for addr in addr
.to_socket_addrs()
.map_err(|e| Error::with_source("Invalid socket address", e))?
{
self.socket_address.push(addr);
}
Ok(self)
}
pub fn serve(self) -> Result<(), Error> {
running::serve(self)
}
}