Skip to content

Commit

Permalink
Make the parse list key to lowercase when insert the keys
Browse files Browse the repository at this point in the history
Signed-off-by: bigduu <[email protected]>
  • Loading branch information
bigduu committed Jul 21, 2023
1 parent 267afbd commit b3d8518
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 2 deletions.
7 changes: 5 additions & 2 deletions src/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,10 +153,10 @@ impl Environment {
/// To switch the default type back to type Strings you need to provide the keys which should be [`Vec<String>`] using this function.
pub fn with_list_parse_key(mut self, key: &str) -> Self {
if self.list_parse_keys.is_none() {
self.list_parse_keys = Some(vec![key.into()])
self.list_parse_keys = Some(vec![key.to_lowercase()])
} else {
self.list_parse_keys = self.list_parse_keys.map(|mut keys| {
keys.push(key.into());
keys.push(key.to_lowercase());
keys
});
}
Expand Down Expand Up @@ -287,6 +287,9 @@ impl Source for Environment {
ValueKind::Float(parsed)
} else if let Some(separator) = &self.list_separator {
if let Some(keys) = &self.list_parse_keys {
#[cfg(feature = "convert-case")]
let key = key.to_lowercase();

if keys.contains(&key) {
let v: Vec<Value> = value
.split(separator)
Expand Down
52 changes: 52 additions & 0 deletions tests/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,58 @@ fn test_parse_string_and_list() {
)
}

#[test]
fn test_parse_string_and_list_ignore_list_parse_key_case() {
// using a struct in an enum here to make serde use `deserialize_any`
#[derive(Deserialize, Debug)]
#[serde(tag = "tag")]
enum TestStringEnum {
String(TestString),
}

#[derive(Deserialize, Debug)]
struct TestString {
string_val: String,
string_list: Vec<String>,
}

temp_env::with_vars(
vec![
("LIST_STRING_LIST", Some("test,string")),
("LIST_STRING_VAL", Some("test,string")),
],
|| {
let environment = Environment::default()
.prefix("LIST")
.list_separator(",")
.with_list_parse_key("STRING_LIST")
.try_parsing(true);

let config = Config::builder()
.set_default("tag", "String")
.unwrap()
.add_source(environment)
.build()
.unwrap();

let config: TestStringEnum = config.try_deserialize().unwrap();

match config {
TestStringEnum::String(TestString {
string_val,
string_list,
}) => {
assert_eq!(String::from("test,string"), string_val);
assert_eq!(
vec![String::from("test"), String::from("string")],
string_list
);
}
}
},
)
}

#[test]
fn test_parse_nested_kebab() {
use config::Case;
Expand Down

0 comments on commit b3d8518

Please sign in to comment.