aboutsummaryrefslogtreecommitdiff
path: root/src/config.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-23 23:23:56 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-23 23:23:56 +0800
commitf9f879e488a62eba9c54c8e713cc94cc9f20e96e (patch)
treee311493f8c491f5a14bedde9e54f3c90c0a3dbdb /src/config.rs
parentee4a0ad75a52960ce674098986ce2b7be1cfe4e7 (diff)
feat(config): refactor default feature name parsing
Diffstat (limited to 'src/config.rs')
-rw-r--r--src/config.rs73
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");
+ }
}