use serde_json::Value;
use crate::{Answer, Error, Session};
pub fn run_verbs(script: &str) -> Result<Vec<Answer>, Error> {
let document: Value =
serde_json::from_str(script).map_err(|error| Error::Json(error.to_string()))?;
let calls = document
.get("verbs")
.and_then(Value::as_array)
.or_else(|| document.as_array())
.ok_or_else(|| Error::Argument {
name: "script".to_owned(),
reason: "must be an array of {verb, arguments} objects".to_owned(),
})?;
let mut session = Session::new();
let mut answers = Vec::with_capacity(calls.len());
for call in calls {
let verb = call
.get("verb")
.and_then(Value::as_str)
.ok_or_else(|| Error::Argument {
name: "verb".to_owned(),
reason: "every script entry needs a string `verb`".to_owned(),
})?;
let arguments = call
.get("arguments")
.cloned()
.unwrap_or_else(|| Value::Object(serde_json::Map::new()));
answers.push(session.run(verb, &arguments)?);
}
Ok(answers)
}