1mod config;
2mod errors;
3mod handlers;
4mod models;
5
6pub use errors::{Error, Result};
7
8use std::net::{IpAddr, Ipv6Addr, SocketAddr};
9
10use axum::{Router, routing::get};
11use tokio::net::TcpListener;
12use tower_http::services::ServeFile;
13
14pub async fn run() -> Result<()> {
15 let config = config::Config::new()?;
16
17 let app = Router::new()
18 .nest_service("/static/style.css", ServeFile::new(&config.style_file))
19 .nest_service("/static/favicon.svg", ServeFile::new(&config.favicon_file))
20 .route("/", get(handlers::handler))
21 .with_state(config.clone());
22
23 let socket = SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), config.port);
24 let listener = TcpListener::bind(socket).await?;
25
26 axum::serve(listener, app).await?;
27
28 Ok(())
29}