service_settings/
service_settings.rs1#![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}