1+ use crate :: event_store:: EventStoreResult ;
2+ use crate :: {
3+ event_store:: { EventStore , EventStoreEntry } ,
4+ EventId , SessionId , StreamId ,
5+ } ;
16use async_trait:: async_trait;
27use std:: collections:: HashMap ;
38use std:: collections:: VecDeque ;
49use tokio:: sync:: RwLock ;
510
6- use crate :: {
7- event_store:: { EventStore , EventStoreMessages } ,
8- EventId , SessionId , StreamId ,
9- } ;
10-
1111const MAX_EVENTS_PER_SESSION : usize = 64 ;
1212const ID_SEPARATOR : & str = "-.-" ;
1313
@@ -101,16 +101,19 @@ impl InMemoryEventStore {
101101 /// );
102102 /// assert_eq!(store.parse_event_id("invalid"), None);
103103 /// ```
104- pub fn parse_event_id < ' a > ( & self , event_id : & ' a str ) -> Option < ( & ' a str , & ' a str , & ' a str ) > {
104+ pub fn parse_event_id < ' a > (
105+ & self ,
106+ event_id : & ' a str ,
107+ ) -> EventStoreResult < ( & ' a str , & ' a str , u128 ) > {
105108 // Check for empty input or invalid characters (e.g., NULL)
106109 if event_id. is_empty ( ) || event_id. contains ( '\0' ) {
107- return None ;
110+ return Err ( "Event ID is empty!" . into ( ) ) ;
108111 }
109112
110113 // Split into exactly three parts
111114 let parts: Vec < & ' a str > = event_id. split ( ID_SEPARATOR ) . collect ( ) ;
112115 if parts. len ( ) != 3 {
113- return None ;
116+ return Err ( "Invalid Event ID format." . into ( ) ) ;
114117 }
115118
116119 let session_id = parts[ 0 ] ;
@@ -119,10 +122,14 @@ impl InMemoryEventStore {
119122
120123 // Ensure no part is empty
121124 if session_id. is_empty ( ) || stream_id. is_empty ( ) || time_stamp. is_empty ( ) {
122- return None ;
125+ return Err ( "Invalid Event ID format." . into ( ) ) ;
123126 }
124127
125- Some ( ( session_id, stream_id, time_stamp) )
128+ let time_stamp: u128 = time_stamp
129+ . parse ( )
130+ . map_err ( |err| format ! ( "Error parsing timestamp: {err}" ) ) ?;
131+
132+ Ok ( ( session_id, stream_id, time_stamp) )
126133 }
127134}
128135
@@ -147,7 +154,7 @@ impl EventStore for InMemoryEventStore {
147154 stream_id : StreamId ,
148155 time_stamp : u128 ,
149156 message : String ,
150- ) -> EventId {
157+ ) -> EventStoreResult < EventId > {
151158 let event_id = self . generate_event_id ( & session_id, & stream_id, time_stamp) ;
152159
153160 let mut storage_map = self . storage_map . write ( ) . await ;
@@ -172,7 +179,7 @@ impl EventStore for InMemoryEventStore {
172179
173180 session_map. push_back ( entry) ;
174181
175- event_id
182+ Ok ( event_id)
176183 }
177184
178185 /// Removes all events associated with a given stream ID within a specific session.
@@ -184,7 +191,11 @@ impl EventStore for InMemoryEventStore {
184191 /// # Arguments
185192 /// - `session_id`: The session identifier to target.
186193 /// - `stream_id`: The stream identifier to remove.
187- async fn remove_stream_in_session ( & self , session_id : SessionId , stream_id : StreamId ) {
194+ async fn remove_stream_in_session (
195+ & self ,
196+ session_id : SessionId ,
197+ stream_id : StreamId ,
198+ ) -> EventStoreResult < ( ) > {
188199 let mut storage_map = self . storage_map . write ( ) . await ;
189200
190201 // Check if session exists
@@ -194,9 +205,10 @@ impl EventStore for InMemoryEventStore {
194205 // Remove session if empty
195206 if events. is_empty ( ) {
196207 storage_map. remove ( & session_id) ;
197- }
208+ } ;
198209 }
199210 // No action if session_id doesn’t exist (idempotent)
211+ Ok ( ( ) )
200212 }
201213
202214 /// Removes all events associated with a given session ID.
@@ -205,9 +217,10 @@ impl EventStore for InMemoryEventStore {
205217 ///
206218 /// # Arguments
207219 /// - `session_id`: The session identifier to remove.
208- async fn remove_by_session_id ( & self , session_id : SessionId ) {
220+ async fn remove_by_session_id ( & self , session_id : SessionId ) -> EventStoreResult < ( ) > {
209221 let mut storage_map = self . storage_map . write ( ) . await ;
210222 storage_map. remove ( & session_id) ;
223+ Ok ( ( ) )
211224 }
212225
213226 /// Retrieves events after a given `event_id` for a specific session and stream.
@@ -221,23 +234,20 @@ impl EventStore for InMemoryEventStore {
221234 /// - `last_event_id`: The event ID (format: `session-.-stream-.-timestamp`) to start after.
222235 ///
223236 /// # Returns
224- /// An `Option` containing `EventStoreMessages ` with the session ID, stream ID, and sorted messages,
237+ /// An `Option` containing `EventStoreEntry ` with the session ID, stream ID, and sorted messages,
225238 /// or `None` if no events are found or the input is invalid.
226- async fn events_after ( & self , last_event_id : EventId ) -> Option < EventStoreMessages > {
227- let Some ( ( session_id , stream_id , time_stamp ) ) = self . parse_event_id ( & last_event_id ) else {
228- tracing :: warn! ( "error parsing last event id: '{last_event_id}'" ) ;
229- return None ;
230- } ;
239+ async fn events_after (
240+ & self ,
241+ last_event_id : EventId ,
242+ ) -> EventStoreResult < Option < EventStoreEntry > > {
243+ let ( session_id , stream_id , time_stamp ) = self . parse_event_id ( & last_event_id ) ? ;
231244
232245 let storage_map = self . storage_map . read ( ) . await ;
246+
247+ // fail silently if session id does not exists
233248 let Some ( events) = storage_map. get ( session_id) else {
234249 tracing:: warn!( "could not find the session_id in the store : '{session_id}'" ) ;
235- return None ;
236- } ;
237-
238- let Ok ( time_stamp) = time_stamp. parse :: < u128 > ( ) else {
239- tracing:: warn!( "could not parse the timestamp: '{time_stamp}'" ) ;
240- return None ;
250+ return Ok ( None ) ;
241251 } ;
242252
243253 let events = match events
@@ -260,15 +270,21 @@ impl EventStore for InMemoryEventStore {
260270
261271 tracing:: trace!( "{} messages after '{last_event_id}'" , events. len( ) ) ;
262272
263- Some ( EventStoreMessages {
273+ Ok ( Some ( EventStoreEntry {
264274 session_id : session_id. to_string ( ) ,
265275 stream_id : stream_id. to_string ( ) ,
266276 messages : events,
267- } )
277+ } ) )
268278 }
269279
270- async fn clear ( & self ) {
280+ async fn clear ( & self ) -> EventStoreResult < ( ) > {
271281 let mut storage_map = self . storage_map . write ( ) . await ;
272282 storage_map. clear ( ) ;
283+ Ok ( ( ) )
284+ }
285+
286+ async fn count ( & self ) -> EventStoreResult < usize > {
287+ let storage_map = self . storage_map . read ( ) . await ;
288+ Ok ( storage_map. len ( ) )
273289 }
274290}
0 commit comments