use super::metadata_lookup::metadata_lookup;
pub(super) fn metadata_str(
metadata: &serde_json::Map<String, serde_json::Value>,
keys: &[&str],
) -> Option<String> {
keys.iter().find_map(|key| {
metadata_lookup(metadata, key)
.and_then(serde_json::Value::as_str)
.map(str::trim)
.filter(|value| !value.is_empty())
.map(ToString::to_string)
})
}
pub(super) fn metadata_string_list(
metadata: &serde_json::Map<String, serde_json::Value>,
keys: &[&str],
) -> Vec<String> {
keys.iter()
.find_map(|key| parse_value(metadata_lookup(metadata, key)?))
.unwrap_or_default()
}
fn parse_value(value: &serde_json::Value) -> Option<Vec<String>> {
value
.as_array()
.map(|items| {
items
.iter()
.filter_map(serde_json::Value::as_str)
.map(str::trim)
.filter(|item| !item.is_empty())
.map(ToString::to_string)
.collect::<Vec<_>>()
})
.filter(|items| !items.is_empty())
.or_else(|| {
value
.as_str()
.map(|items| {
items
.split(['\n', ','])
.map(str::trim)
.filter(|item| !item.is_empty())
.map(ToString::to_string)
.collect::<Vec<_>>()
})
.filter(|items| !items.is_empty())
})
}