Attribute Macro ruva_macro::event_hook

source ·
#[event_hook]
Expand description

Attribute macro for marking repository methods that collect events

Example


#[aggregate]
#[derive(Default, Serialize, Deserialize)]
struct TestAggregate {
    #[identifier]
    pub age: i64,
}

#[async_trait]
impl TRepository<SQLExecutor, TestAggregate> for SqlRepository<TestAggregate> {
    fn new(executor: Arc<RwLock<SQLExecutor>>) -> Self {
         ...
    }

    #[event_hook]
    async fn update(
        &mut self,
        aggregate: &mut TestAggregate,
    ) -> Result<(), BaseError> {
        Ok(())
    }
}

async fn test_event_hook() {
    '_given: {
        let mut repo = SqlRepository::new(SQLExecutor::new());
        let mut aggregate = TestAggregate::default().set_age(64);
        aggregate.raise_event(SomeEvent { id: aggregate.age }.to_message());

        '_when: {
            let _ = repo.update(&mut aggregate).await;
            let events = repo.get_events();

            '_then: {
                assert!(!events.is_empty())
            }
        }
    }
}