aboutsummaryrefslogtreecommitdiffstats
path: root/zoned/src/main.rs
blob: 8787a4ad0ba763be5ace53fbc4b7112007d07db3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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)
}