envbind 0.1.0

Typed environment binding primitives for Rust services.
Documentation
#![allow(missing_docs)]

use envbind::{Binder, BoolVar, Environment, ParameterSource, StringVar, U16Var, validators};

#[derive(Debug, Clone, PartialEq, Eq)]
struct ServiceSettings {
    host: String,
    port: u16,
    service_name: String,
    tracing_enabled: bool,
}

impl ParameterSource for ServiceSettings {
    fn bind<E: Environment>(binder: &Binder<E>) -> Result<Self, envbind::BindError> {
        Ok(Self {
            host: binder.bind(&StringVar::new("SERVICE_HOST").default("127.0.0.1"))?,
            port: binder.bind(
                &U16Var::new("SERVICE_PORT")
                    .default(8080)
                    .validate(validators::u16_in_range(1, 65_535)),
            )?,
            service_name: binder.bind(&StringVar::new("SERVICE_NAME").default("api"))?,
            tracing_enabled: binder.bind(&BoolVar::new("SERVICE_TRACING").default(false))?,
        })
    }
}

fn main() -> Result<(), envbind::BindError> {
    let settings = ServiceSettings::from_process_environment()?;
    println!("{settings:?}");
    Ok(())
}