use std::collections::HashMap;
use adk_core::Result;
use async_trait::async_trait;
use tokio::sync::RwLock;
use crate::domain::TransactionId;
#[async_trait]
pub trait PaymentMandateLedger: Send + Sync {
async fn consume(
&self,
payment_mandate_id: &str,
transaction_id: &TransactionId,
) -> Result<Option<TransactionId>>;
}
#[derive(Debug, Default)]
pub struct InMemoryPaymentMandateLedger {
consumed: RwLock<HashMap<String, TransactionId>>,
}
impl InMemoryPaymentMandateLedger {
#[must_use]
pub fn new() -> Self {
Self::default()
}
}
#[async_trait]
impl PaymentMandateLedger for InMemoryPaymentMandateLedger {
async fn consume(
&self,
payment_mandate_id: &str,
transaction_id: &TransactionId,
) -> Result<Option<TransactionId>> {
let mut consumed = self.consumed.write().await;
if let Some(previous) = consumed.get(payment_mandate_id) {
return Ok(Some(previous.clone()));
}
consumed.insert(payment_mandate_id.to_string(), transaction_id.clone());
Ok(None)
}
}