use crate::Error;
pub async fn create(
charge_id: &str,
amount_cents: Option<i64>,
idempotency_key: &str,
reason: Option<stripe::RefundReasonFilter>,
) -> Result<stripe::Refund, Error> {
let _ = idempotency_key;
let client = crate::Stripe::client();
let mut params = stripe::CreateRefund::new();
let charge: stripe::ChargeId = charge_id
.parse()
.map_err(|_| Error::Stripe(format!("invalid charge id: {charge_id}")))?;
params.charge = Some(charge);
params.amount = amount_cents;
params.reason = reason;
let refund = stripe::Refund::create(client, params).await?;
Ok(refund)
}
pub async fn create_for_payment_intent(
payment_intent_id: &str,
amount_cents: Option<i64>,
idempotency_key: &str,
reason: Option<stripe::RefundReasonFilter>,
) -> Result<stripe::Refund, Error> {
let _ = idempotency_key;
let client = crate::Stripe::client();
let mut params = stripe::CreateRefund::new();
let pi_id: stripe::PaymentIntentId = payment_intent_id
.parse()
.map_err(|_| Error::Stripe(format!("invalid payment intent id: {payment_intent_id}")))?;
params.payment_intent = Some(pi_id);
params.amount = amount_cents;
params.reason = reason;
let refund = stripe::Refund::create(client, params).await?;
Ok(refund)
}
pub async fn list_for_payment_intent(
payment_intent_id: &str,
) -> Result<Vec<stripe::Refund>, Error> {
let pi_id: stripe::PaymentIntentId = payment_intent_id
.parse()
.map_err(|_| Error::Stripe(format!("invalid payment intent id: {payment_intent_id}")))?;
let client = crate::Stripe::client();
let mut params = stripe::ListRefunds::new();
params.payment_intent = Some(pi_id);
params.limit = Some(10);
let list = stripe::Refund::list(client, ¶ms).await?;
Ok(list.data)
}
pub async fn retrieve(refund_id: &str) -> Result<stripe::Refund, Error> {
let client = crate::Stripe::client();
let id: stripe::RefundId = refund_id
.parse()
.map_err(|_| Error::Stripe(format!("invalid refund id: {refund_id}")))?;
let refund = stripe::Refund::retrieve(client, &id, &[]).await?;
Ok(refund)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn invalid_payment_intent_id_does_not_parse() {
assert!("not_a_pi".parse::<stripe::PaymentIntentId>().is_err());
}
#[tokio::test]
async fn list_for_payment_intent_invalid_id_returns_error() {
let result = list_for_payment_intent("not-a-pi").await;
assert!(
matches!(result, Err(Error::Stripe(_))),
"expected Err(Error::Stripe(_)) for invalid pi id, got: {result:?}"
);
}
}