use serde::{Deserialize, Serialize, Serializer};
use crate::{
errors::KrError,
said::SelfAddressingPrefix,
serialization_info::{SerializationFormats, SerializationInfo},
Digestible, EventTypeTag, Typeable,
};
#[derive(Default, Deserialize, Debug, Clone, PartialEq)]
pub struct EventMessage<D> {
#[serde(rename = "v")]
pub serialization_info: SerializationInfo,
#[serde(flatten)]
pub event: D,
}
impl<D: Digestible> EventMessage<D> {
pub fn get_digest(&self) -> SelfAddressingPrefix {
self.event.get_digest()
}
}
impl<T: Clone + Serialize + Digestible + Typeable> EventMessage<T> {
pub fn serialization(&self) -> SerializationFormats {
self.serialization_info.kind
}
pub fn serialize(&self) -> Result<Vec<u8>, KrError> {
self.serialization().encode(self)
}
}
impl<D: Digestible + Typeable + Serialize + Clone> Serialize for EventMessage<D> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
#[derive(Serialize)]
struct TypedEventMessage<D> {
v: SerializationInfo,
#[serde(rename = "t")]
event_type: EventTypeTag,
#[serde(rename = "d")]
digest: SelfAddressingPrefix,
#[serde(flatten)]
event: D,
}
impl<D: Digestible + Typeable + Clone> From<&EventMessage<D>> for TypedEventMessage<D> {
fn from(em: &EventMessage<D>) -> Self {
TypedEventMessage {
v: em.serialization_info,
event_type: em.event.get_type(),
digest: em.event.get_digest(),
event: em.event.clone(),
}
}
}
let tem: TypedEventMessage<_> = self.into();
tem.serialize(serializer)
}
}