nitinol_persistence/
writer.rs

1use 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}