Skip to main content

service_settings/
service_settings.rs

1#![allow(missing_docs)]
2
3use envbind::{Binder, BoolVar, Environment, ParameterSource, StringVar, U16Var, validators};
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6struct ServiceSettings {
7    host: String,
8    port: u16,
9    service_name: String,
10    tracing_enabled: bool,
11}
12
13impl ParameterSource for ServiceSettings {
14    fn bind<E: Environment>(binder: &Binder<E>) -> Result<Self, envbind::BindError> {
15        Ok(Self {
16            host: binder.bind(&StringVar::new("SERVICE_HOST").default("127.0.0.1"))?,
17            port: binder.bind(
18                &U16Var::new("SERVICE_PORT")
19                    .default(8080)
20                    .validate(validators::u16_in_range(1, 65_535)),
21            )?,
22            service_name: binder.bind(&StringVar::new("SERVICE_NAME").default("api"))?,
23            tracing_enabled: binder.bind(&BoolVar::new("SERVICE_TRACING").default(false))?,
24        })
25    }
26}
27
28fn main() -> Result<(), envbind::BindError> {
29    let settings = ServiceSettings::from_process_environment()?;
30    println!("{settings:?}");
31    Ok(())
32}