stepflow-json 0.0.3

StepFlow flow definitions using JSON
Documentation
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 {
    // Build action
    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()));
      }
    };

    // Set action
    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(())
}