use crate::{error::BusError, id::MessageId};
use async_trait::async_trait;
use std::time::Duration;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ClaimOutcome {
Claimed,
AlreadyPending,
AlreadyDone,
}
#[async_trait]
pub trait IdempotencyStore: Send + Sync {
async fn try_claim(&self, key: &MessageId, ttl: Duration) -> Result<ClaimOutcome, BusError>;
async fn mark_done(&self, key: &MessageId) -> Result<(), BusError>;
async fn release(&self, key: &MessageId) -> Result<(), BusError>;
}
#[cfg(test)]
mod tests {
use super::ClaimOutcome;
#[test]
fn claim_outcome_variants_exist() {
let _ = ClaimOutcome::Claimed;
let _ = ClaimOutcome::AlreadyPending;
let _ = ClaimOutcome::AlreadyDone;
}
#[test]
fn claim_outcome_is_eq_and_debug() {
assert_eq!(ClaimOutcome::Claimed, ClaimOutcome::Claimed);
assert_ne!(ClaimOutcome::Claimed, ClaimOutcome::AlreadyDone);
let _ = format!("{:?}", ClaimOutcome::AlreadyPending);
}
}