Crate env_settings
source ·Expand description
Env settings
Env Settings is a Rust library that helps you to initialize structs using environment variables
This Rust library took inspiration from
pydantic's BaseSettingsPython class
Installation
cargo add env-settings
cargo add env-settings-derive
Usage
When you add the EnvSettings derive to a struct, two methods are added to it
fn from_env() -> env_settings_utils::EnvSettingsResult<Self>It creates a new instance using just the environment variables. If something fails, it returns an
env_settings_utils::EnvSettingsErrorerrorfn new(...) -> env_settings_utils::EnvSettingsResult<Self>It creates a new instance using a combination of environment variables and parameters. More in detail, every field value can be passed as parameter wrapped in an
Optionobject. Then if the parameter isSome, it is used, otherwise the value is recoved from the environment variables. If something fails, it returns anenv_settings_utils::EnvSettingsErrorerror
Basic
// `export name=paolo` in shell or
std::env::set_var("name", "paolo");
// `export age=42` in shell or
std::env::set_var("age", "42");
use env_settings_derive::EnvSettings;
// `delay` is necessary because environment variables are set at run time
#[derive(EnvSettings)]
#[env_settings(delay)]
struct MyStruct {
name: String,
age: u8,
}
let my_struct = MyStruct::from_env().unwrap();
assert_eq!(my_struct.name, "paolo".to_string());
assert_eq!(my_struct.age, 42);
let name = "luca";
let my_struct = MyStruct::new(Some(name.to_string()), None).unwrap();
assert_eq!(my_struct.name, name);
assert_eq!(my_struct.age, 42);Advanced
use std::io::prelude::Write;
// `export MY_STRUCT_NAME=paolo` in shell or
std::env::set_var("MY_STRUCT_NAME", "paolo");
// `echo "MY_STRUCT_AGE=42\n" > .env` in shell or
let mut env_file = std::fs::File::create(".env").unwrap();
env_file.write_all("MY_STRUCT_AGE=42\n".as_bytes()).unwrap();
use env_settings_derive::EnvSettings;
// `delay` is necessary because environment variables are set at run time
#[derive(EnvSettings)]
#[env_settings(case_insensitive, delay, file_path = ".env", prefix="MY_STRUCT_")]
struct MyStruct {
name: String,
age: u8,
}
let my_struct = MyStruct::from_env().unwrap();
assert_eq!(my_struct.name, "paolo".to_string());
assert_eq!(my_struct.age, 42);
let name = "luca";
let my_struct = MyStruct::new(Some(name.to_string()), None).unwrap();
assert_eq!(my_struct.name, name);
assert_eq!(my_struct.age, 42);Parameters
The current supported parameters are:
case_insensitive: add it if the environment variables matching should be case insensitivedelay: add it to delay the lookup for environment variables from compilation time to run timefile_path: add it to specify a file path to read to add some environment variables (e.g..env)prefix: add it to specify a prefix to add to the name of the struct fields before matching the environment variables
Variables resolution hierarchy
- Arguments passed to the
newmethod (if usingnew). - Environment variables
- Variables loaded from a file (e.g.
.env)
Traits
- The trait to add to the derive