| Crates.io | serde-env-field |
| lib.rs | serde-env-field |
| version | 0.3.2 |
| created_at | 2023-10-26 01:37:06.501525+00 |
| updated_at | 2023-11-07 04:03:28.73051+00 |
| description | A helper for serde deserialization with environment variables expansion |
| homepage | |
| repository | https://github.com/mrshiposha/serde-env-field |
| max_upload_size | |
| id | 1013951 |
| size | 69,499 |
This crate provides the EnvField<T> type capable of deserializing the T type
from a string with environment variables expanded.
During deserialization, the EnvField will try to deserialize the data as a string and expand all
the environment variables. After the expansion, the resulting string will be used
to construct the T value.
By default, the EnvField will construct the T value using the FromStr trait.
However, it is possible to make it use the Deserialize trait using the UseDeserialize marker.
If the supplied data was not a string, the EnvField
will attempt to deserialize the T type directly from the data.
The EnvField works nicely with Option, Vec, and #[serde(default)].
Also, the crate provides the env_field_wrap attribute that wraps all the fields of a struct or an enum with the EnvField type.
The attribute also honors the optional and vector fields.
EnvField Example#[derive(Serialize, Deserialize)]
struct Example {
name: EnvField<String>,
size: EnvField<usize>,
num: EnvField<i32>,
}
std::env::set_var("SIZE", "100");
let de: Example = toml::from_str(r#"
name = "${NAME:-Default Name}"
size = "$SIZE"
num = 42
"#).unwrap();
assert_eq!(&de.name, "Default Name");
assert_eq!(de.size, 100);
assert_eq!(de.num, 42);
env_field_wrap Example#[env_field_wrap]
#[derive(Serialize, Deserialize)]
struct Example {
name: String,
size: usize,
num: i32,
}
std::env::set_var("SIZE", "100");
let de: Example = toml::from_str(r#"
name = "${NAME:-Default Name}"
size = "$SIZE"
num = 42
"#).unwrap();
assert_eq!(&de.name, "Default Name");
assert_eq!(de.size, 100);
assert_eq!(de.num, 42);
See the documentation of the EnvField and the env_field_wrap for details.