diff --git a/Cargo.lock b/Cargo.lock index 05b8133..8c32cbc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1090,7 +1090,7 @@ dependencies = [ [[package]] name = "mneme" -version = "0.4.2" +version = "0.5.0" dependencies = [ "bytes", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 5a20969..5bed7e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mneme" -version = "0.4.2" +version = "0.5.0" authors = ["John Wilger "] edition = "2024" description = "An event-sourcing library for Rust projects." diff --git a/src/command.rs b/src/command.rs index 99a0808..d5bc659 100644 --- a/src/command.rs +++ b/src/command.rs @@ -14,7 +14,7 @@ pub trait Command: Clone { fn get_state(&self) -> Self::State; - fn set_state(&mut self, state: Self::State); + fn set_state(&mut self, state: &Self::State); fn mark_retry(&self) -> Self where @@ -36,9 +36,11 @@ pub trait Command: Clone { } pub trait AggregateState: Debug + Sized { - fn apply(&self, event: &E) -> Self; + fn apply(&mut self, event: &E) -> &Self; } impl AggregateState for () { - fn apply(&self, _: &E) {} + fn apply(&mut self, _: &E) -> &Self { + self + } } diff --git a/src/lib.rs b/src/lib.rs index 8cb454e..bec261b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -174,7 +174,7 @@ mod tests { type Error = Error; fn get_state(&self) -> Self::State {} - fn set_state(&mut self, _: Self::State) {} + fn set_state(&mut self, _: &Self::State) {} fn event_stream_id(&self) -> EventStreamId { EventStreamId(self.id) } @@ -334,8 +334,8 @@ mod tests { self.state.clone() } - fn set_state(&mut self, state: Self::State) { - self.state = state; + fn set_state(&mut self, state: &Self::State) { + self.state = state.to_owned(); } fn event_stream_id(&self) -> EventStreamId { @@ -378,18 +378,17 @@ mod tests { } impl AggregateState for StatefulCommandState { - fn apply(&self, event: &TestEvent) -> Self { + fn apply(&mut self, event: &TestEvent) -> &Self { match event { - TestEvent::FooHappened { value, .. } => Self { - foo: Some(*value), - ..*self - }, - TestEvent::BarHappened { value, .. } => Self { - bar: Some(*value), - ..*self - }, - _ => Self { ..*self }, + TestEvent::FooHappened { value, .. } => { + self.foo = Some(*value); + } + TestEvent::BarHappened { value, .. } => { + self.bar = Some(*value); + } + _ => (), } + self } } #[tokio::test] @@ -476,7 +475,7 @@ mod tests { EventStreamId(self.id) } fn get_state(&self) -> Self::State {} - fn set_state(&mut self, _: Self::State) {} + fn set_state(&mut self, _: &Self::State) {} } #[tokio::test] diff --git a/tests/test_cases.rs b/tests/test_cases.rs index 93ee6f3..c3a662a 100644 --- a/tests/test_cases.rs +++ b/tests/test_cases.rs @@ -33,7 +33,7 @@ impl Command for NoopCommand { EventStreamId(self.id) } fn get_state(&self) -> Self::State {} - fn set_state(&mut self, _: Self::State) {} + fn set_state(&mut self, _: &Self::State) {} } #[derive(Debug, thiserror::Error)] @@ -63,7 +63,7 @@ impl Command for RejectCommand { EventStreamId(self.id) } fn get_state(&self) -> Self::State {} - fn set_state(&mut self, _: Self::State) {} + fn set_state(&mut self, _: &Self::State) {} } #[derive(Clone)] @@ -92,7 +92,7 @@ impl Command for EventProducingCommand { EventStreamId(self.id) } fn get_state(&self) -> Self::State {} - fn set_state(&mut self, _: Self::State) {} + fn set_state(&mut self, _: &Self::State) {} } #[derive(Clone, Debug)] @@ -102,18 +102,17 @@ pub struct StatefulCommandState { } impl AggregateState for StatefulCommandState { - fn apply(&self, event: &TestEvent) -> Self { + fn apply(&mut self, event: &TestEvent) -> &Self { match event { - TestEvent::FooHappened { value, .. } => Self { - foo: Some(*value), - ..*self - }, - TestEvent::BarHappened { value, .. } => Self { - bar: Some(*value), - ..*self - }, - _ => Self { ..*self }, + TestEvent::FooHappened { value, .. } => { + self.foo = Some(*value); + } + TestEvent::BarHappened { value, .. } => { + self.bar = Some(*value); + } + _ => (), } + self } } @@ -144,8 +143,8 @@ impl Command for StatefulCommand { self.state.clone() } - fn set_state(&mut self, state: Self::State) { - self.state = state; + fn set_state(&mut self, state: &Self::State) { + self.state = state.to_owned(); } fn event_stream_id(&self) -> EventStreamId {