Skip to main content

outbox_core/idempotency/
strategy.rs

1use crate::config::IdempotencyStrategy;
2use crate::model::Event;
3
4impl IdempotencyStrategy {
5    /// Invokes the idempotency strategy to generate or retrieve a token.
6    ///
7    /// # Panics
8    ///
9    /// Panics if the strategy is set to `Custom`, but the provided `get_event`
10    /// closure returns `None`.
11    pub fn invoke<F>(&self, provided_token: Option<String>, get_event: F) -> Option<String>
12    where
13        F: FnOnce() -> Option<Event>,
14    {
15        match self {
16            IdempotencyStrategy::Provided => provided_token,
17            IdempotencyStrategy::Custom(f) => {
18                let event = get_event().expect("Strategy is Custom, but no Event context provided");
19                Some(f(&event))
20            }
21            IdempotencyStrategy::Uuid => Some(uuid::Uuid::now_v7().to_string()),
22            // IdempotencyStrategy::HashPayload => {
23            //     Some("hash_payload".to_string())
24            // }
25            IdempotencyStrategy::None => None,
26        }
27    }
28}