1pub mod api;
2pub mod config;
3pub mod exceptions;
4pub mod models;
5pub mod services;
6pub mod utils;
7
8use std::sync::Arc;
9
10use axum::Router;
11use tower_http::LatencyUnit;
12use tower_http::trace::{DefaultMakeSpan, DefaultOnRequest, DefaultOnResponse, TraceLayer};
13use tracing::Level;
14
15use crate::api::fetch::{self, ApiState};
16use crate::config::AppConfig;
17use crate::services::HttpClient;
18
19pub fn build_app() -> Router {
20 build_app_with_config(AppConfig::default())
21}
22
23pub fn build_app_with_config(config: AppConfig) -> Router {
24 let client = Arc::new(HttpClient::new(config));
25 let state = ApiState { client };
26
27 let trace_layer = TraceLayer::new_for_http()
28 .make_span_with(DefaultMakeSpan::new().level(Level::INFO))
29 .on_request(DefaultOnRequest::new().level(Level::INFO))
30 .on_response(
31 DefaultOnResponse::new()
32 .level(Level::INFO)
33 .latency_unit(LatencyUnit::Millis),
34 );
35
36 fetch::router(state).layer(trace_layer)
37}