mod auth; mod error; mod extract; mod response; mod routers; mod state; pub use auth::{JwtClaims, create_jwt, create_password, validate_jwt, validate_password}; pub use error::{ApiError, ApiResult}; pub use response::{ErrorResponse, FailResponse, SuccessResponse}; pub use state::AppState; use sea_orm::Database; use tokio::net::TcpListener; use tower_http::trace::TraceLayer; use tracing::info; use tracing_subscriber::EnvFilter; async fn app_state() -> AppState { let db_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); let secret = std::env::var("SECRET").expect("SECRET must be set"); AppState { db: Database::connect(db_url).await.unwrap(), secret: secret, } } async fn listener() -> TcpListener { let addr = std::env::var("SERVER_BIND").expect("SERVER_BIND must be set"); TcpListener::bind(addr).await.unwrap() } #[tokio::main] async fn main() { tracing_subscriber::fmt() .with_env_filter(EnvFilter::new("info,sqlx=warn,tower_http=debug")) .init(); let state = app_state().await; let router = routers::router() .layer(TraceLayer::new_for_http()) .with_state(state); let listener = listener().await; info!( "Start listening server on http://{:?}", listener.local_addr().unwrap() ); axum::serve(listener, router).await.unwrap(); }