diff options
Diffstat (limited to 'src/config.rs')
| -rw-r--r-- | src/config.rs | 73 |
1 files changed, 67 insertions, 6 deletions
diff --git a/src/config.rs b/src/config.rs index 06aa088..5962103 100644 --- a/src/config.rs +++ b/src/config.rs @@ -22,17 +22,78 @@ fn read_default_feature_name() -> String { Err(_) => return "async".to_string(), }; - let value: toml::Value = match content.parse() { - Ok(v) => v, - Err(_) => return "async".to_string(), - }; + parse_feature_name_from_toml(&content).unwrap_or_else(|| "async".to_string()) +} +/// Pure function: parse `default_feature_name` from TOML content. +/// Returns `None` if the key is missing, unreadable, or not a string. +fn parse_feature_name_from_toml(content: &str) -> Option<String> { + let value: toml::Value = content.parse().ok()?; value .get("package") .and_then(|p| p.get("metadata")) .and_then(|m| m.get("might_be_async")) .and_then(|a| a.get("default_feature_name")) .and_then(|v| v.as_str()) - .unwrap_or("async") - .to_string() + .map(|s| s.to_string()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parses_custom_feature_name() { + let toml = r#" + [package] + [package.metadata.might_be_async] + default_feature_name = "my_async" + "#; + assert_eq!( + parse_feature_name_from_toml(toml), + Some("my_async".to_string()) + ); + } + + #[test] + fn missing_metadata_returns_none() { + let toml = "[package]\nname = \"foo\"\n"; + assert_eq!(parse_feature_name_from_toml(toml), None); + } + + #[test] + fn missing_might_be_async_section_returns_none() { + let toml = r#" + [package] + [package.metadata] + some_other_key = "value" + "#; + assert_eq!(parse_feature_name_from_toml(toml), None); + } + + #[test] + fn empty_string_returns_none() { + assert_eq!(parse_feature_name_from_toml(""), None); + } + + #[test] + fn invalid_toml_returns_none() { + assert_eq!(parse_feature_name_from_toml("not valid toml {{"), None); + } + + #[test] + fn value_is_not_string_returns_none() { + let toml = r#" + [package.metadata.might_be_async] + default_feature_name = 42 + "#; + assert_eq!(parse_feature_name_from_toml(toml), None); + } + + #[test] + fn env_default_returns_foo_async() { + // In `cargo test`, CARGO_MANIFEST_DIR is set to this crate's directory, + // whose Cargo.toml has `default_feature_name = "foo_async"`. + assert_eq!(default_feature_name(), "foo_async"); + } } |
