use serde_json::Value;
pub(crate) fn value_at(payload: &Value, path: &[&str]) -> Option<Value> {
let mut current = payload;
for key in path {
current = current.get(*key)?;
}
Some(current.clone())
}
pub(crate) fn value_at_any(payload: &Value, paths: &[&[&str]]) -> Option<Value> {
paths.iter().find_map(|path| value_at(payload, path))
}
pub(crate) fn string_at(payload: &Value, path: &[&str]) -> Option<String> {
value_at(payload, path)
.and_then(|value| match value {
Value::String(value) => Some(value),
Value::Number(value) => Some(value.to_string()),
Value::Bool(value) => Some(value.to_string()),
_ => None,
})
.filter(|value| !value.is_empty())
}
pub(crate) fn string_at_any(payload: &Value, paths: &[&[&str]]) -> Option<String> {
paths.iter().find_map(|path| string_at(payload, path))
}