envbind 0.1.0

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

use envbind::{
    BindError, Binder, BoolVar, Environment, MapEnvironment, ParameterSource, StringVar,
};

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

impl ParameterSource for ServiceSettings {
    fn bind<E: Environment>(binder: &Binder<E>) -> Result<Self, BindError> {
        Ok(Self {
            service_name: binder.bind(&StringVar::new("SERVICE_NAME").default("svc"))?,
            tracing_enabled: binder.bind(&BoolVar::new("TRACE_ENABLED").default(false))?,
        })
    }
}

#[test]
fn parameter_source_builds_from_map_environment() {
    let settings = ServiceSettings::from_environment(MapEnvironment::from_pairs([(
        "SERVICE_NAME",
        "gateway",
    )]));

    assert_eq!(
        settings,
        Ok(ServiceSettings {
            service_name: "gateway".to_owned(),
            tracing_enabled: false,
        })
    );
}

#[test]
fn parameter_source_uses_defaults_for_empty_map_environment() {
    let settings = ServiceSettings::from_environment(MapEnvironment::new());

    assert_eq!(
        settings,
        Ok(ServiceSettings {
            service_name: "svc".to_owned(),
            tracing_enabled: false,
        })
    );
}