use std::collections::HashMap;
use tinyjson::JsonValue;
use stepflow::prelude::*;
use stepflow::{Session, Error};
use stepflow::object::IdError;
use stepflow::action::{SetDataAction, StringTemplateAction, HtmlEscapedString, UriEscapedString, HtmlFormAction, HtmlFormConfig};
use super::error::StepFlowParseError;
use super::json::{jsonval_get_obj, jsonval_obj_get_str, jsonval_obj_get_obj, jsonval_obj_get_u64};
use super::data::statedata_from_jsonval_obj;
pub fn parse_actions_json(session: &mut Session, actions_json: &HashMap<String, JsonValue>)
-> Result<(), StepFlowParseError>
{
for (step_name, action_info) in actions_json {
let action_info = jsonval_get_obj(action_info, step_name)?;
let action_type = jsonval_obj_get_str(action_info, "type")?;
let action_id = session.action_store_mut().reserve_id();
let action = match &action_type[..] {
"UriStringTemplate" => {
let template = jsonval_obj_get_str(action_info, "template")?.clone();
StringTemplateAction::new(action_id, UriEscapedString::already_escaped(template)).boxed()
},
"HtmlStringTemplate" => {
let template = jsonval_obj_get_str(action_info, "template")?.clone();
StringTemplateAction::new(action_id, HtmlEscapedString::already_escaped(template)).boxed()
},
"SetData" => {
let statedata_json = jsonval_obj_get_obj(action_info, "stateData")?;
let state_data = statedata_from_jsonval_obj(statedata_json, session.var_store())?;
let after_attempt: u64 = jsonval_obj_get_u64(action_info, "afterAttempt")?;
SetDataAction::new(action_id, state_data, after_attempt).boxed()
},
"HtmlForm" => {
let mut html_config: HtmlFormConfig = Default::default();
if action_info.contains_key("stringHtml") {
html_config.stringvar_html_template = jsonval_obj_get_str(action_info, "stringHtml")?.clone();
}
if action_info.contains_key("emailHtml") {
html_config.emailvar_html_template = jsonval_obj_get_str(action_info, "emailHtml")?.clone();
}
if action_info.contains_key("boolHtml") {
html_config.boolvar_html_template = jsonval_obj_get_str(action_info, "boolHtml")?.clone();
}
if action_info.contains_key("prefixHtml") {
html_config.prefix_html_template = Some(jsonval_obj_get_str(action_info, "prefixHtml")?.clone());
}
if action_info.contains_key("wrapTag") {
html_config.wrap_tag = Some(jsonval_obj_get_str(action_info, "wrapTag")?.clone());
}
HtmlFormAction::new(action_id, html_config).boxed()
},
_ => {
return Err(StepFlowParseError::UnexpectedValue(action_type.clone()));
}
};
session.action_store_mut().register_named(step_name.clone(), action)
.map_err(|e| Error::ActionId(e))?;
if step_name.eq("$all") {
session.set_action_for_step(action_id, None)?;
} else {
let step_id = session.step_store().id_from_name(&step_name[..])
.ok_or_else(|| Error::StepId(IdError::NoSuchName(step_name.clone())))?
.clone();
session.set_action_for_step(action_id, Some(&step_id))?;
}
}
Ok(())
}