[−][src]Function cqrs_proptest::roundtrip_through_serialization
pub fn roundtrip_through_serialization<E: SerializableEvent + DeserializableEvent>(
original: &E
) -> E
Given a serializable event, constructs a buffer, serializes the event to the buffer, and then deserializes the event, returning the deserialized value.
Examples
use cqrs_core::{Event, SerializableEvent, DeserializableEvent}; use cqrs_proptest::roundtrip_through_serialization; use serde::{Serialize, Deserialize}; #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] struct CreatedEvent{}; impl Event for CreatedEvent { fn event_type(&self) -> &'static str { "created" } } #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] struct DeletedEvent{}; impl Event for DeletedEvent { fn event_type(&self) -> &'static str { "deleted" } } #[derive(Clone, Copy, Debug, PartialEq, Eq)] enum MyEvents { Created(CreatedEvent), Deleted(DeletedEvent), } impl Event for MyEvents { fn event_type(&self) -> &'static str { match *self { MyEvents::Created(ref e) => e.event_type(), MyEvents::Deleted(ref e) => e.event_type(), } } } impl SerializableEvent for MyEvents { type Error = serde_json::Error; fn serialize_event_to_buffer(&self, buffer: &mut Vec<u8>) -> Result<(), Self::Error> { match *self { MyEvents::Created(ref e) => serde_json::to_writer(buffer, e), MyEvents::Deleted(ref e) => serde_json::to_writer(buffer, e), } } } impl DeserializableEvent for MyEvents { type Error = serde_json::Error; fn deserialize_event_from_buffer(buffer: &[u8], event_type: &str) -> Result<Option<Self>, Self::Error> { match event_type { "created" => serde_json::from_reader(buffer).map(MyEvents::Created).map(Some), "deleted" => serde_json::from_reader(buffer).map(MyEvents::Deleted).map(Some), _ => Ok(None), } } } let original = MyEvents::Created(CreatedEvent{}); let roundtrip = roundtrip_through_serialization(&original); assert_eq!(original, roundtrip);