renvar
is a library to deserialize environment variables into Rust data structures.
Huge thanks to softprops for envy, as this library is inspired by it and borrows much of the code from there.
Add it to your Cargo.toml
[dependencies]
renvar = "0.1"
use renvar::{from_env, from_iter, from_str};
use serde::Deserialize;
use std::env;
let env_content = r#"
name=renvar
type=Library
dependencies=serde
"#;
#[derive(Debug, Deserialize, PartialEq, Eq)]
enum CrateType {
Library,
Binary,
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
struct Renvar {
name: String,
#[serde(rename = "type")]
typ: CrateType,
dependencies: Vec<String>,
}
let actual = Renvar {
name: "renvar".to_owned(),
typ: CrateType::Library,
dependencies: vec!["serde".to_owned()],
};
// we can read from strings
let value = from_str::<Renvar>(env_content).unwrap();
assert_eq!(value, actual);
// directly from the environment
let envs = vec![
("name".to_owned(), "renvar".to_owned()),
("type".to_owned(), "Library".to_owned()),
("dependencies".to_owned(), "serde".to_owned()),
];
for (key, value) in envs.clone().into_iter() {
env::set_var(key, value);
}
let value = from_env::<Renvar>().unwrap();
assert_eq!(value, actual);
// or from iterables
let value = from_iter::<Renvar, _>(envs).unwrap();
assert_eq!(value, actual);
Renvar has the following feature flags:
prefixed
gives you the prefixed
function, that accepts a prefix. The prefixes will be stripped away
before deserialization.
postfix
is exactly the same as prefix, just with postfixes
Case insensitive variant of prefixed
Case insensitive variant of postfixed
Finally, the with_trimmer
feature flag gives you *_with_trimmer
variants for all of the above,
where you can strip extraneous characters off of the beginning and end of envrironment variables
by passing a closure.
Strings
andstr
senums
sequences
Unit structs
If you have just, you run just test
,
otherwise cargo test --all-features