use crate::{
dummy_event::DummyEventMessage,
errors::KrError,
event_message::EventMessage,
said::{SelfAddressing, SelfAddressingPrefix},
serialization_info::SerializationFormats,
Digestible, EventTypeTag, Typeable,
};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct SaidEvent<D> {
#[serde(rename = "d", skip_serializing)]
digest: SelfAddressingPrefix,
#[serde(flatten)]
pub content: D,
}
impl<D: Serialize + Clone + Typeable> SaidEvent<D> {
pub fn new(digest: SelfAddressingPrefix, content: D) -> Self {
Self { digest, content }
}
pub(crate) fn to_message(
event: D,
format: SerializationFormats,
derivation: &SelfAddressing,
) -> Result<EventMessage<SaidEvent<D>>, KrError> {
let dummy_event = DummyEventMessage::dummy_event(event.clone(), format, derivation)?;
let digest = derivation.derive(&dummy_event.serialize()?);
Ok(EventMessage {
serialization_info: dummy_event.serialization_info,
event: Self {
digest,
content: event,
},
})
}
}
impl<D> Digestible for SaidEvent<D> {
fn get_digest(&self) -> SelfAddressingPrefix {
self.digest.clone()
}
}
impl<D: Typeable> Typeable for SaidEvent<D> {
fn get_type(&self) -> EventTypeTag {
self.content.get_type()
}
}