use axum::Router;
use crate::controller::{ApplyControllerOnRouter, ControllerList};
const WILDCART: &str = "0.0.0.0";
pub struct WebServer;
impl WebServer {
pub async fn start<S>(name: &'static str, state: S, controllers: ControllerList<S>, port: Option<u32>, dev_port: Option<u32>, ip_override: Option<&str>, emoji: Option<char>) -> anyhow::Result<()>
where
S: Clone + Send + Sync + 'static
{
let ip_address = ip_override.unwrap_or(WILDCART);
let host = if ip_address == WILDCART { "localhost" } else { ip_address };
let port = if cfg!(debug_assertions) {
dev_port.unwrap_or(8080)
} else {
port.unwrap_or(80)
};
let ip = format!("{ip_address}:{port}");
let listener = tokio::net::TcpListener::bind(ip.clone())
.await?;
let router = Router::new()
.use_controllers(controllers)
.with_state(state);
#[cfg(feature = "cookie")]
let router = router.layer(axum_cookie::CookieLayer::default());
let emoji = emoji.unwrap_or('📡');
log::info!("{emoji} {name} available at http://{host}:{port}");
Ok(axum::serve(listener, router)
.await?)
}
}