mod auth; mod error; mod extract; mod response; mod routers; mod state; pub use auth::{JwtClaims, create_jwt, create_password, validate_jwt, validate_password}; use axum::Router; 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; fn env(name: &str) -> String { std::env::var(name).expect(format!("{} must be set", name).as_str()) } async fn listener() -> TcpListener { TcpListener::bind(env("SERVER_BIND")).await.unwrap() } async fn router() -> Router { let db = Database::connect(env("DATABASE_URL")).await.unwrap(); let secret = env("SECRET"); routers::router() .layer(TraceLayer::new_for_http()) .with_state(AppState { db, secret }) } #[tokio::main] async fn main() { tracing_subscriber::fmt() .with_env_filter(EnvFilter::new("info,sqlx=warn,tower_http=debug")) .init(); let listener = listener().await; let router = router().await; info!( "Start listening server on http://{:?}", listener.local_addr().unwrap() ); axum::serve(listener, router).await.unwrap(); }