pub mod api; pub mod config; use axum::{http::Uri, response::IntoResponse, routing::get, Router}; use std::net::SocketAddr; use std::sync::Arc; use tower_http::trace::{self, TraceLayer}; use tracing::Level; use crate::config::Config; pub struct Context { pub config: Config, } #[tokio::main] async fn main() -> Result<(), Box> { tracing_subscriber::fmt() .with_target(false) .compact() .init(); let config = match Config::open(Config::data_dir()?.join("config.toml").as_path()) { Ok(config) => { println!("Config loaded: {:?}", config); config } Err(err) => { eprintln!("{}", err); Config::new() } }; let state = Arc::new(Context { config: config.clone(), }); let app = Router::new().nest("/api", api::routes(state)).layer( TraceLayer::new_for_http() .make_span_with(trace::DefaultMakeSpan::new().level(Level::INFO)) .on_response(trace::DefaultOnResponse::new().level(Level::INFO)), ); let address: SocketAddr = format!("{}:{}", config.server.address, config.server.port).parse()?; let lister = tokio::net::TcpListener::bind(&address).await?; println!("Listening on {}", address); axum::serve(lister, app.into_make_service()).await?; Ok(()) }