event_store 0.1.1

Crate to deal with every aspect of an eventstore
Documentation
use crate::event::{unsaved::UnsavedEvent, Event};

use super::*;

#[derive(Serialize, serde::Deserialize)]
pub struct MyStructEvent {}

#[derive(Serialize, serde::Deserialize)]
pub enum MyEnumEvent {
    Created { id: i32 },
    Updated(String),
    Deleted,
}

impl Event for MyEnumEvent {
    fn event_type(&self) -> &'static str {
        match *self {
            Self::Deleted => "MyEnumEvent::Deleted",
            Self::Created { .. } => "MyEnumEvent::Created",
            Self::Updated(_) => "MyEnumEvent::Updated",
        }
    }

    fn all_event_types() -> Vec<&'static str> {
        vec![
            "MyEnumEvent::Deleted",
            "MyEnumEvent::Collect",
            "MyEnumEvent::Updated",
        ]
    }
}

impl Event for MyStructEvent {
    fn event_type(&self) -> &'static str {
        "MyStructEvent"
    }

    fn all_event_types() -> Vec<&'static str> {
        vec!["MyStructEvent"]
    }
}

impl std::convert::TryFrom<crate::prelude::RecordedEvent> for MyEnumEvent {
    type Error = ();
    fn try_from(e: crate::prelude::RecordedEvent) -> Result<Self, Self::Error> {
        serde_json::from_value(e.data).map_err(|_| ())
    }
}
impl std::convert::TryFrom<crate::prelude::RecordedEvent> for MyStructEvent {
    type Error = ();
    fn try_from(e: crate::prelude::RecordedEvent) -> Result<Self, Self::Error> {
        serde_json::from_value(e.data).map_err(|_| ())
    }
}

mod unsaved {
    use super::*;

    use pretty_assertions::assert_eq;

    #[test]
    fn must_have_a_valide_event_type() {
        let source_events = vec![
            MyEnumEvent::Created { id: 1 },
            MyEnumEvent::Updated("Updated".into()),
            MyEnumEvent::Deleted,
        ];

        let mut produces_events: Vec<UnsavedEvent> = source_events
            .iter()
            .map(UnsavedEvent::try_from)
            .filter(Result::is_ok)
            .map(Result::unwrap)
            .collect();

        let next = MyStructEvent {};

        produces_events.push(UnsavedEvent::try_from(&next).unwrap());

        let expected = vec![
            "MyEnumEvent::Created",
            "MyEnumEvent::Updated",
            "MyEnumEvent::Deleted",
            "MyStructEvent",
        ];

        assert_eq!(expected.len(), produces_events.len());
        expected
            .into_iter()
            .zip(produces_events)
            .for_each(|(ex, real)| assert_eq!(ex, real.event_type));
    }
}