use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub enum Command {
#[serde(rename = "resume")]
Resume {
#[serde(rename = "resume")]
value: Value,
},
#[serde(rename = "goto")]
Goto {
node: String,
},
}
impl Command {
pub fn resume(value: impl Into<Value>) -> Self {
Self::Resume {
value: value.into(),
}
}
pub fn goto(node: impl Into<String>) -> Self {
Self::Goto { node: node.into() }
}
pub fn is_resume(&self) -> bool {
matches!(self, Self::Resume { .. })
}
pub fn is_goto(&self) -> bool {
matches!(self, Self::Goto { .. })
}
pub fn resume_value(&self) -> Option<&Value> {
match self {
Self::Resume { value } => Some(value),
_ => None,
}
}
pub fn goto_node(&self) -> Option<&str> {
match self {
Self::Goto { node } => Some(node),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_command_resume() {
let cmd = Command::resume(true);
assert!(cmd.is_resume());
assert_eq!(cmd.resume_value(), Some(&serde_json::json!(true)));
}
#[test]
fn test_command_goto() {
let cmd = Command::goto("node1");
assert!(cmd.is_goto());
assert_eq!(cmd.goto_node(), Some("node1"));
}
}