use crate::config::{Client, Response};
use crate::params::{Identifiable, List, Metadata, RangeQuery, Timestamp};
use crate::resources::Currency;
use serde_derive::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Copy, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RefundReason {
Duplicate,
Fraudulent,
RequestedByCustomer,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RefundStatus {
Pending,
Succeeded,
Failed,
Canceled,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RefundFailureReason {
LostOrStolenCard,
ExpiredOrCanceledCard,
Unknown,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct RefundParams<'a> {
pub charge: &'a str,
pub amount: Option<u64>,
pub metadata: Metadata,
pub reason: Option<RefundReason>,
pub refund_application_fee: Option<bool>,
pub reverse_transfer: Option<bool>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct RefundListParams<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub charge: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<RangeQuery<Timestamp>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ending_before: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starting_after: Option<&'a str>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Refund {
pub id: String,
pub amount: u64,
pub balance_transaction: String,
pub charge: String,
pub created: Timestamp,
pub currency: Currency,
pub failure_balance_transaction: Option<String>,
pub failure_reason: Option<RefundFailureReason>,
pub metadata: Metadata,
pub reason: Option<RefundReason>,
pub receipt_number: Option<String>,
pub status: RefundStatus,
}
impl Refund {
pub fn create(client: &Client, params: RefundParams<'_>) -> Response<Refund> {
client.post_form("/refunds", params)
}
pub fn retrieve(client: &Client, refund_id: &str) -> Response<Refund> {
client.get(&format!("/refunds/{}", refund_id))
}
pub fn update(
client: &Client,
refund_id: &str,
metadata: Option<Metadata>,
) -> Response<Refund> {
client.post_form(&format!("/refunds/{}", refund_id), metadata)
}
pub fn list(client: &Client, params: RefundListParams<'_>) -> Response<List<Refund>> {
client.get_query("/refunds", ¶ms)
}
}
impl Identifiable for Refund {
fn id(&self) -> &str {
&self.id
}
}