use crate::expr::Expr;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
pub type StepId = String;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum CardMode {
Text,
Json,
Card,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct MessageStep {
pub mode: CardMode,
pub template: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub next: Option<StepId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct QuestionStep {
pub question_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub next: Option<StepId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct DecisionCase {
#[serde(rename = "if")]
pub if_expr: Expr,
pub goto: StepId,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct DecisionStep {
pub cases: Vec<DecisionCase>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_goto: Option<StepId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct FlowPolicy {
#[serde(default)]
pub allow_back: bool,
#[serde(default)]
pub allow_submit_all: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum StepSpec {
Message(MessageStep),
Question(QuestionStep),
Decision(DecisionStep),
Action { name: String },
End,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct QAFlowSpec {
pub id: String,
pub title: String,
pub version: String,
pub entry: StepId,
pub steps: BTreeMap<StepId, StepSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
pub policies: Option<FlowPolicy>,
}