nitinol_persistence/
writer.rs1use nitinol_core::event::Event;
2use nitinol_core::identifier::EntityId;
3use nitinol_protocol::io::{WriteProtocol, Writer};
4
5#[derive(Debug, Clone)]
6pub struct EventWriter {
7 writer: WriteProtocol,
8 retry: i64
9}
10
11impl EventWriter {
12 pub fn new(writer: impl Writer) -> EventWriter {
13 Self { writer: WriteProtocol::new(writer), retry: 3 }
14 }
15
16 pub fn set_retry(mut self, retry: i64) -> Self {
17 self.retry = retry;
18 self
19 }
20}
21
22impl EventWriter {
23 pub(crate) async fn write<E: Event>(&self, id: EntityId, event: &E, seq: i64) {
24 let mut retry = 0;
25 loop {
26 match self.writer.write(id.clone(), event, seq).await {
27 Ok(()) => break,
28 Err(e) => {
29 tracing::error!("on failure persist caused reason `{e}`");
30
31 retry += 1;
32
33 if retry >= self.retry {
34 tracing::error!("retry limit exceeded");
35 break;
36 } else {
37 continue;
38 }
39 }
40 }
41 }
42 }
43}