use crate::builder::ServerBuilder;
use crate::error::{Error, Result};
use crate::shutdown::shutdown_signal;
use axum::Router;
use std::net::SocketAddr;
use tokio::net::TcpListener;
pub struct Server {
router: Router<()>,
listener: TcpListener,
local_addr: SocketAddr,
}
impl Server {
pub fn builder() -> ServerBuilder {
ServerBuilder::new()
}
pub(crate) fn from_parts(
router: Router<()>,
listener: TcpListener,
local_addr: SocketAddr,
) -> Self {
Self {
router,
listener,
local_addr,
}
}
#[must_use]
pub fn local_addr(&self) -> SocketAddr {
self.local_addr
}
pub async fn run(self) -> Result<()> {
self.run_with_shutdown(shutdown_signal()).await
}
pub async fn run_with_shutdown<F>(self, shutdown: F) -> Result<()>
where
F: std::future::Future<Output = ()> + Send + 'static,
{
axum::serve(self.listener, self.router)
.with_graceful_shutdown(shutdown)
.await
.map_err(Error::from)
}
}