use serde_json::Value;
pub(crate) fn string_array(payload: &Value, key: &str) -> Vec<String> {
payload
.get(key)
.and_then(Value::as_array)
.map(|values| {
values
.iter()
.filter_map(Value::as_str)
.map(ToString::to_string)
.collect::<Vec<_>>()
})
.unwrap_or_default()
}
#[cfg(test)]
mod tests {
use super::string_array;
use serde_json::json;
#[test]
fn extracts_string_array_when_field_is_array_of_strings() {
let payload = json!({ "agent_chain": ["orchestrator", "agent-007"] });
assert_eq!(
string_array(&payload, "agent_chain"),
vec!["orchestrator".to_string(), "agent-007".to_string()]
);
}
#[test]
fn missing_field_returns_empty_vec() {
let payload = json!({});
assert!(string_array(&payload, "agent_chain").is_empty());
}
#[test]
fn null_field_returns_empty_vec() {
let payload = json!({ "agent_chain": null });
assert!(string_array(&payload, "agent_chain").is_empty());
}
#[test]
fn non_array_field_returns_empty_vec() {
let payload = json!({ "agent_chain": "not-an-array" });
assert!(string_array(&payload, "agent_chain").is_empty());
}
#[test]
fn non_string_entries_are_filtered_out() {
let payload = json!({ "agent_chain": ["orchestrator", 42, "agent-007", null] });
assert_eq!(
string_array(&payload, "agent_chain"),
vec!["orchestrator".to_string(), "agent-007".to_string()]
);
}
}