use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XStateMachine {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub initial: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub state_type: Option<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub states: BTreeMap<String, XStateNode>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub on: BTreeMap<String, XTransitionValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub always: Option<XTransitionValue>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub after: BTreeMap<String, XTransitionValue>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub entry: Vec<XActionValue>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub exit: Vec<XActionValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub context: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub history: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XStateNode {
#[serde(skip_serializing_if = "Option::is_none")]
pub initial: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub state_type: Option<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub states: BTreeMap<String, XStateNode>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub on: BTreeMap<String, XTransitionValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub always: Option<XTransitionValue>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub after: BTreeMap<String, XTransitionValue>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub entry: Vec<XActionValue>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub exit: Vec<XActionValue>,
#[serde(skip_serializing_if = "Option::is_none")]
pub history: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum XTransitionValue {
Simple(String),
Object(XTransitionObject),
Array(Vec<XTransitionItem>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum XTransitionItem {
Simple(String),
Object(XTransitionObject),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XTransitionObject {
#[serde(skip_serializing_if = "Option::is_none")]
pub target: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub guard: Option<XGuardValue>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub actions: Vec<XActionValue>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum XGuardValue {
Simple(String),
Object(XGuardObject),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XGuardObject {
#[serde(rename = "type")]
pub guard_type: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum XActionValue {
Simple(String),
Object(XActionObject),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XActionObject {
#[serde(rename = "type")]
pub action_type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
}