Take the pain out of keeping all your calendars together
at main 2.2 kB view raw
1use std::sync::OnceLock; 2use sqlx::PgConnection; 3use tokio::sync::Mutex; 4 5mod calendar; 6 7#[cfg(feature = "ssr")] 8#[derive(Debug)] 9pub struct State { 10 sqlx_connection: Mutex<PgConnection>, 11 reqwest_client: reqwest::Client, 12} 13 14#[cfg(feature = "ssr")] 15static STATE: OnceLock<State> = OnceLock::new(); 16 17#[cfg(feature = "ssr")] 18#[tokio::main] 19async fn main() { 20 use std::env; 21 22 use axum::{routing::get, Router}; 23 use leptos::logging::log; 24 use leptos::prelude::*; 25 use leptos_axum::{generate_route_list, LeptosRoutes}; 26 use calpoll::app::*; 27 use sqlx::Connection; 28 29 rustls::crypto::ring::default_provider().install_default().expect("Failed to set default crypto provider for rustls..."); // Needed for fast-dav-rs since as it doesn't properly enable features... 30 31 let connection = 32 PgConnection::connect( 33 env::var("DATABASE_URL") 34 .expect("Please ensure you set your database URL in the $DATABASE_URL environment variable") 35 .as_str()).await.expect("Failed to connect to database defined in $DATABASE_URL"); 36 37 STATE.set(State { 38 sqlx_connection: Mutex::new(connection), 39 reqwest_client: reqwest::Client::new(), 40 }).expect("Consistency issue: failed to set STATE - was it already set?"); 41 42 let conf = get_configuration(None).unwrap(); 43 let addr = conf.leptos_options.site_addr; 44 let leptos_options = conf.leptos_options; 45 // Generate the list of routes in your Leptos App 46 let routes = generate_route_list(App); 47 48 let app = Router::new() 49 .route("/calendar/{id}", get(calendar::route)) 50 .leptos_routes(&leptos_options, routes, { 51 let leptos_options = leptos_options.clone(); 52 move || shell(leptos_options.clone()) 53 }) 54 .fallback(leptos_axum::file_and_error_handler(shell)) 55 .with_state(leptos_options); 56 57 // run our app with hyper 58 // `axum::Server` is a re-export of `hyper::Server` 59 log!("listening on http://{}", &addr); 60 let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); 61 axum::serve(listener, app.into_make_service()) 62 .await 63 .expect("Failed to start axum server"); 64}