use dioxus::{fullstack::axum::Router, server::axum::Extension}; use crate::App; use crate::server::{auth::build_auth_layer, config, database, key_val_store}; use crate::util::error::{Contextualize, Error, Result}; pub fn main() -> Result { if let Err(e) = dotenvy::dotenv() { tracing::warn!("Error reading .env: {e}"); } // `Ok(...?)` is because `dioxus::serve` expects an `anyhow::Result` dioxus::serve(async move || Ok(router_setup().await?)); } /// Set up the axum Router async fn router_setup() -> Result { tracing::debug!("Loading configuration..."); let config = config::load_config() .map_err(|e| Error::message_here(e.to_string())) .err_context("Failed to load config")?; let db_pool = database::setup(config.database.connection_uri()) .await .err_context("Failed database setup")?; let key_val_pool = key_val_store::setup(&config.key_val_store.connection_uri()) .await .err_context("Failed key-value store setup")?; let auth_layer = build_auth_layer(db_pool.clone(), key_val_pool); let router = dioxus::server::router(App) .layer(Extension(db_pool)) .layer(auth_layer); tracing::info!("Setup complete, returning Router..."); Ok(router) }