use anyhow::Context; use axum::extract::Extension; use figment::{ providers::{Env, Format, Serialized, Toml}, Figment, }; use tracing::{debug_span, info, Instrument}; 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 = Config::try_from(figment)?; let shared_state = State::try_from(&config)?.into_arc(); let routes = build_routes().layer(Extension(shared_state)); info!(ip_address = %config.ip_address, port = %config.port, "Server listening"); axum::Server::bind(&config.into()) .serve(routes.into_make_service()) .instrument(debug_span!("read_task").or_current()) .await .context("Axum error") .map_err(zoned::Error::from) }