55 lines
1.3 KiB
Rust
55 lines
1.3 KiB
Rust
|
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<dyn std::error::Error>> {
|
||
|
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(())
|
||
|
}
|