#[cfg(feature = "ssr")] #[tokio::main] async fn main() { use axum::{response::Redirect, routing::get, Router}; use leptos::logging::log; use leptos::prelude::*; use leptos_axum::{generate_route_list, LeptosRoutes}; use stormscribe::components::app::*; use stormscribe::data::content::ContentController; let conf = get_configuration(None).unwrap(); let addr = conf.leptos_options.site_addr; let leptos_options = conf.leptos_options; // Generate the list of routes in your Leptos App let routes = generate_route_list(App); let data_dir = std::path::Path::join(&std::env::current_dir().unwrap(), "data"); let content_controller = ContentController::init(data_dir).await.unwrap(); let app = Router::new() .route("/", get(|| async { Redirect::temporary("/~/") })) .leptos_routes_with_context(&leptos_options, routes, move || { provide_context(content_controller.clone()); }, { let leptos_options = leptos_options.clone(); move || shell(leptos_options.clone()) }) .fallback(leptos_axum::file_and_error_handler(shell)) .with_state(leptos_options); // run our app with hyper // `axum::Server` is a re-export of `hyper::Server` log!("listening on http://{}", &addr); let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); axum::serve(listener, app.into_make_service()) .with_graceful_shutdown(shutdown_signal()) .await .unwrap(); } #[cfg(feature = "ssr")] async fn shutdown_signal() { use tokio::signal; let ctrl_c = async { signal::ctrl_c() .await .expect("could not install SIGINT handler") }; #[cfg(unix)] let terminate = async { signal::unix::signal(signal::unix::SignalKind::terminate()) .expect("could not install SIGTERM handler") .recv() .await; }; #[cfg(not(unix))] let terminate = std::future::pending::<()>(); tokio::select! { _ = ctrl_c => {}, _ = terminate => {}, } } #[cfg(not(feature = "ssr"))] pub fn main() { // no client-side main function // unless we want this to work with e.g., Trunk for pure client-side testing // see lib.rs for hydration function instead }