Skip to main content

payrail_core/
refund.rs

1use crate::{IdempotencyKey, Money, PaymentProvider, PaymentStatus, ProviderReference};
2
3/// Refund request.
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub struct RefundRequest {
6    /// Provider to route the refund to.
7    pub provider: PaymentProvider,
8    /// Provider payment reference.
9    pub provider_reference: ProviderReference,
10    /// Required idempotency key for retry-safe refund creation.
11    pub idempotency_key: IdempotencyKey,
12    /// Optional partial refund amount.
13    pub amount: Option<Money>,
14    /// Optional reason.
15    pub reason: Option<String>,
16}
17
18/// Capture request.
19#[derive(Debug, Clone, PartialEq, Eq)]
20pub struct CaptureRequest {
21    /// Provider to route the capture to.
22    pub provider: PaymentProvider,
23    /// Provider payment reference.
24    pub provider_reference: ProviderReference,
25    /// Required idempotency key for retry-safe capture.
26    pub idempotency_key: IdempotencyKey,
27}
28
29/// Refund response.
30#[derive(Debug, Clone, PartialEq, Eq)]
31pub struct RefundResponse {
32    /// Provider handling the refund.
33    pub provider: PaymentProvider,
34    /// Provider refund reference.
35    pub provider_reference: ProviderReference,
36    /// Normalized status after refund.
37    pub status: PaymentStatus,
38}
39
40/// Capture response.
41#[derive(Debug, Clone, PartialEq, Eq)]
42pub struct CaptureResponse {
43    /// Provider handling the capture.
44    pub provider: PaymentProvider,
45    /// Provider payment reference.
46    pub provider_reference: ProviderReference,
47    /// Normalized status after capture.
48    pub status: PaymentStatus,
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    #[test]
56    fn write_requests_carry_idempotency_keys() {
57        let key = IdempotencyKey::new("ORDER-1:refund").expect("key should be valid");
58        let refund = RefundRequest {
59            provider: PaymentProvider::Stripe,
60            provider_reference: ProviderReference::new("pi_123")
61                .expect("reference should be valid"),
62            idempotency_key: key.clone(),
63            amount: None,
64            reason: None,
65        };
66        let capture = CaptureRequest {
67            provider: PaymentProvider::PayPal,
68            provider_reference: ProviderReference::new("ORDER-1")
69                .expect("reference should be valid"),
70            idempotency_key: IdempotencyKey::new("ORDER-1:capture").expect("key should be valid"),
71        };
72
73        assert_eq!(refund.idempotency_key, key);
74        assert_eq!(capture.provider, PaymentProvider::PayPal);
75    }
76}