use crate::{
dummy_event::DelegatedInceptionEvent,
errors::KrError,
event::{KrInceptionEvent, KrRotationEvent},
identifier_state::IdentifierState,
EventSemantics, EventTypeTag, Typeable,
};
use serde::{de, Deserialize, Deserializer, Serialize};
use serde_json::Value;
#[derive(Clone, Debug, PartialEq, Serialize)]
#[serde(untagged, rename_all = "lowercase")]
pub enum EventData {
Icp(KrInceptionEvent),
Rot(KrRotationEvent),
Dip(DelegatedInceptionEvent),
Drt(KrRotationEvent),
}
impl<'de> Deserialize<'de> for EventData {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
struct EventType {
t: EventTypeTag,
}
let v = Value::deserialize(deserializer)?;
let m = EventType::deserialize(&v).map_err(de::Error::custom)?;
match m.t {
EventTypeTag::Icp => Ok(EventData::Icp(
KrInceptionEvent::deserialize(&v).map_err(de::Error::custom)?,
)),
EventTypeTag::Rot => Ok(EventData::Rot(
KrRotationEvent::deserialize(&v).map_err(de::Error::custom)?,
)),
EventTypeTag::Dip => Ok(EventData::Dip(
DelegatedInceptionEvent::deserialize(&v).map_err(de::Error::custom)?,
)),
EventTypeTag::Drt => Ok(EventData::Drt(
KrRotationEvent::deserialize(&v).map_err(de::Error::custom)?,
)),
_ => {
Err(KrError::SemanticError("Not a key event".into())).map_err(de::Error::custom)?
}
}
}
}
impl EventSemantics for EventData {
fn apply_to(&self, state: IdentifierState) -> Result<IdentifierState, KrError> {
match self {
Self::Icp(e) => e.apply_to(state),
Self::Rot(e) => e.apply_to(state),
Self::Dip(e) => e.apply_to(state),
Self::Drt(e) => e.apply_to(state),
}
}
}
impl From<EventData> for EventTypeTag {
fn from(ed: EventData) -> Self {
match ed {
EventData::Icp(_) => EventTypeTag::Icp,
EventData::Rot(_) => EventTypeTag::Rot,
EventData::Dip(_) => EventTypeTag::Dip,
EventData::Drt(_) => EventTypeTag::Drt,
}
}
}
impl Typeable for EventData {
fn get_type(&self) -> EventTypeTag {
self.into()
}
}