use std::net::SocketAddr; use axum::Router; use axum::routing::{get, post}; use sqlx::migrate::MigrateError; use tokio::net::TcpListener; use crate::config::IceBingoConfig; use crate::model::app::AppState; mod config; pub(crate) mod model; mod api; pub(crate) mod error; pub(crate) mod util; mod database; #[tokio::main] async fn main() { println!("Starting up"); let config = IceBingoConfig::load("config.yaml") .await.expect("Unable to load config"); let state: AppState = AppState::new(config.clone()).await.unwrap(); migrate(state.clone()).await.expect("Database migration failed"); let router = build_router(state); let listener = listen(config).await; axum::serve::serve(listener, router).await.unwrap() } fn build_router(state: AppState) -> Router { Router::new() .route("/webhook/travelynx", post(api::handlers::webhook::receive_travelynx)) .route("/card/", get(api::handlers::bingo_card::get)) .with_state(state) } async fn listen(config: IceBingoConfig) -> TcpListener { let socket_addr: SocketAddr = (config.http.bind_address, config.http.port).into(); println!("Listening on {}", socket_addr); TcpListener::bind(socket_addr).await.unwrap() } async fn migrate(state: AppState) -> Result<(), MigrateError>{ sqlx::migrate!("./src/sql/migrations") .run(&mut state.db.acquire().await?) .await }