use axum::{extract::FromRef, Router}; use tower_http::services::ServeDir; use crate::app::{self, App}; mod api; mod auth; mod error; mod version; #[cfg(test)] pub mod test; pub fn make_router(app: App) -> Router { Router::new() .nest("/api", api::router()) .with_state(app.clone()) .nest_service("/swagger", ServeDir::new(app.swagger_dir_path)) .nest_service("/", ServeDir::new(app.web_dir_path)) } pub async fn launch(app: App) -> Result<(), std::io::Error> { let port = app.port; let router = make_router(app); let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{port}")).await?; axum::serve(listener, router).await?; Ok(()) } impl FromRef for app::collection::Browser { fn from_ref(app: &App) -> Self { app.browser.clone() } } impl FromRef for app::collection::Index { fn from_ref(app: &App) -> Self { app.index.clone() } } impl FromRef for app::collection::Updater { fn from_ref(app: &App) -> Self { app.updater.clone() } } impl FromRef for app::config::Manager { fn from_ref(app: &App) -> Self { app.config_manager.clone() } } impl FromRef for app::ddns::Manager { fn from_ref(app: &App) -> Self { app.ddns_manager.clone() } } impl FromRef for app::lastfm::Manager { fn from_ref(app: &App) -> Self { app.lastfm_manager.clone() } } impl FromRef for app::playlist::Manager { fn from_ref(app: &App) -> Self { app.playlist_manager.clone() } } impl FromRef for app::user::Manager { fn from_ref(app: &App) -> Self { app.user_manager.clone() } } impl FromRef for app::settings::Manager { fn from_ref(app: &App) -> Self { app.settings_manager.clone() } } impl FromRef for app::thumbnail::Manager { fn from_ref(app: &App) -> Self { app.thumbnail_manager.clone() } } impl FromRef for app::vfs::Manager { fn from_ref(app: &App) -> Self { app.vfs_manager.clone() } }