use anyhow::Result;
use async_trait::async_trait;
use chrono::{DateTime, Utc};
use serde::{de, Serialize};
use std::fmt::Debug;
pub trait AggregateId:
std::fmt::Display + Debug + Clone + Serialize + for<'de> de::Deserialize<'de> + Send + Sync + 'static {
fn type_name(&self) -> String;
fn value(&self) -> String;
}
pub trait Event: Debug + Clone + Serialize + for<'de> de::Deserialize<'de> + Send + Sync + 'static {
type ID: std::fmt::Display;
type AggregateID: AggregateId;
fn id(&self) -> &Self::ID;
fn aggregate_id(&self) -> &Self::AggregateID;
fn seq_nr(&self) -> usize;
fn occurred_at(&self) -> &DateTime<Utc>;
fn is_created(&self) -> bool;
}
pub trait Aggregate: Debug + Clone + Serialize + for<'de> de::Deserialize<'de> + Send + Sync + 'static {
type ID: AggregateId;
fn id(&self) -> &Self::ID;
fn seq_nr(&self) -> usize;
fn version(&self) -> usize;
fn set_version(&mut self, version: usize);
fn last_updated_at(&self) -> &DateTime<Utc>;
}
#[async_trait]
pub trait EventStore: Debug + Clone + Sync + Send + 'static {
type EV: Event;
type AG: Aggregate;
type AID: AggregateId;
async fn store_event_and_snapshot_opt(
&mut self,
event: &Self::EV,
version: usize,
aggregate: Option<&Self::AG>,
) -> Result<()>;
async fn get_latest_snapshot_by_id(&self, aid: &Self::AID) -> Result<(Self::AG, usize, usize)>;
async fn get_events_by_id_since_seq_nr(&self, aid: &Self::AID, seq_nr: usize) -> Result<Vec<Self::EV>>;
}