1use async_trait::async_trait;
2use serde::{de::DeserializeOwned, Serialize};
3
4use super::{error::EsEntityError, events::EntityEvents, nested::*};
5
6pub trait EsEvent: DeserializeOwned + Serialize + Send + Sync {
7 type EntityId: Clone
8 + PartialEq
9 + sqlx::Type<sqlx::Postgres>
10 + Eq
11 + std::hash::Hash
12 + Send
13 + Sync;
14}
15
16pub trait IntoEvents<E: EsEvent> {
17 fn into_events(self) -> EntityEvents<E>;
18}
19
20pub trait TryFromEvents<E: EsEvent> {
21 fn try_from_events(events: EntityEvents<E>) -> Result<Self, EsEntityError>
22 where
23 Self: Sized;
24}
25
26pub trait EsEntity: TryFromEvents<Self::Event> {
27 type Event: EsEvent;
28 type New: IntoEvents<Self::Event>;
29
30 fn events(&self) -> &EntityEvents<Self::Event>;
31 fn last_persisted(&self, n: usize) -> crate::events::LastPersisted<Self::Event> {
32 self.events().last_persisted(n)
33 }
34
35 fn events_mut(&mut self) -> &mut EntityEvents<Self::Event>;
36}
37
38pub trait Parent<T: EsEntity> {
39 fn nested(&self) -> &Nested<T>;
40 fn nested_mut(&mut self) -> &mut Nested<T>;
41}
42
43pub trait EsRepo {
44 type Entity: EsEntity;
45 type Err: From<EsEntityError>;
46}
47
48#[async_trait]
49pub trait PopulateNested<C>: EsRepo {
50 async fn populate(
51 &self,
52 lookup: std::collections::HashMap<C, &mut Nested<<Self as EsRepo>::Entity>>,
53 ) -> Result<(), <Self as EsRepo>::Err>;
54}
55
56pub trait RetryableInto<T>: Into<T> + Copy + std::fmt::Debug {}
57impl<T, O> RetryableInto<O> for T where T: Into<O> + Copy + std::fmt::Debug {}