use anyhow::Context; use axum::extract::Extension; use figment::{ providers::{Env, Format, Serialized, Toml}, Figment, }; use std::{net::SocketAddr, sync::Arc}; use tracing::info; use zoned::{build_routes, Config, State}; #[tokio::main] async fn main() -> Result<(), zoned::Error> { tracing_subscriber::fmt::init(); let figment = Figment::from(Serialized::defaults(Config::default())) .merge(Toml::file(Env::var_or("ZONED_CONFIG", "/etc/zoned/Config.toml")).nested()) .merge(Env::prefixed("ZONED_")); let config = match Config::try_from(figment) { Ok(config) => config, Err(err) => return Err(err), }; let addr = SocketAddr::from((config.ip_address, config.port)); let shared_state = match State::try_from(config) { Ok(config) => Arc::new(config), Err(err) => return Err(err), }; let routes = build_routes().layer(Extension(shared_state)); info!("listening on {}", addr); axum::Server::bind(&addr) .serve(routes.into_make_service()) .await .context("Axum error") .map_err(zoned::Error::from) }