Take the pain out of keeping all your calendars together
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}