use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)]
pub enum InstanceAction {
InstanceStart,
FlushMetrics,
SendCtrlAltDel,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawInstanceActionInfo {
pub action_type: InstanceAction,
}
#[derive(Debug, Clone, Serialize)]
#[non_exhaustive]
pub struct InstanceActionInfo {
pub action_type: InstanceAction,
}
impl From<RawInstanceActionInfo> for InstanceActionInfo {
fn from(raw: RawInstanceActionInfo) -> Self {
Self {
action_type: raw.action_type,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_should_deserialize_instance_start_pascal_case() {
let json = r#"{"action_type":"InstanceStart"}"#;
let raw: RawInstanceActionInfo = serde_json::from_str(json).unwrap();
assert_eq!(raw.action_type, InstanceAction::InstanceStart);
}
#[test]
fn test_should_deserialize_send_ctrl_alt_del_for_arch_rejection_downstream() {
let json = r#"{"action_type":"SendCtrlAltDel"}"#;
let raw: RawInstanceActionInfo = serde_json::from_str(json).unwrap();
assert_eq!(raw.action_type, InstanceAction::SendCtrlAltDel);
}
#[test]
fn test_should_reject_unknown_action() {
let json = r#"{"action_type":"Frobnicate"}"#;
assert!(serde_json::from_str::<RawInstanceActionInfo>(json).is_err());
}
}