pub fn string_valued_entries(
entries: &serde_json::Map<String, serde_json::Value>,
) -> impl Iterator<Item = (&str, &str)> {
entries
.iter()
.filter_map(|(name, value)| Some((name.as_str(), value.as_str()?)))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_string_valued_entries_skips_every_non_string_value_kind() {
let deps = serde_json::json!({
"bad-object": {"nested": "0.0.1"},
"bad-number": 1,
"bad-bool": true,
"bad-null": null,
"bad-array": ["1.0.0"],
"express": "^4.18.2",
});
let deps = deps.as_object().unwrap();
let mut entries: Vec<_> = string_valued_entries(deps).collect();
entries.sort_unstable();
assert_eq!(entries, vec![("express", "^4.18.2")]);
}
#[test]
fn test_string_valued_entries_all_invalid_yields_empty() {
let deps = serde_json::json!({
"bad-object": {"nested": "0.0.1"},
"bad-number": 1,
});
let deps = deps.as_object().unwrap();
assert_eq!(string_valued_entries(deps).count(), 0);
}
#[test]
fn test_string_valued_entries_empty_object_yields_empty() {
let deps = serde_json::json!({});
let deps = deps.as_object().unwrap();
assert_eq!(string_valued_entries(deps).count(), 0);
}
}