eventmill 0.4.0

Event sourcing and CQRS for Rust applications
Documentation

Abstractions

Event applied to an aggregate state results in a modified aggregate state:

(aggregate, Event) -> aggregate'

Commands are handled by aggregates resulting in a zero, one or several events:

(Aggregate, Command) -> Vec<NewEvent>
(NewEvent, Store) -> DomainEvent

Aggregates have a generation property. The generation of an aggregate enumerates the number of modifications through a sequence of applied events.

Applying an event to an aggregate advances its state from the current generation n to the next generation n+1:

(Aggregate(n), DomainEvent) -> Aggregate(n+1)

Aggregates can be replayed by applying all stored events to a newly initialized aggregate:

(initialized aggregate, &[DomainEvent]) -> current aggregate

Dispatching a Command

Given a command we need to find the right aggregate instance to handle it.

When dispatcher gets the aggregate instance it calls the handle_command function. The returned list of events (Vec<NewEvent>) will be enriched with the address properties of the aggregate to get the related DomainEvents.