use rocket::serde::Deserialize;
use validator::Validate;
use super::{customer::StripeCustomerDetails, date::StripeDate, StripeCurrency};
#[derive(Debug, Deserialize)]
#[serde(crate = "rocket::serde")]
#[serde(rename_all = "lowercase")]
pub enum StripeChargeStatus {
Failed,
Pending,
Succeeded,
}
#[derive(Debug, Deserialize, Validate)]
#[serde(crate = "rocket::serde")]
pub struct StripeCharge<'s> {
#[validate(contains(pattern = "ch_"))]
pub id: &'s str,
pub created: StripeDate,
pub currency: StripeCurrency,
pub paid: bool,
pub status: StripeChargeStatus,
pub amount: u32,
pub billing_details: StripeCustomerDetails,
pub calculated_statement_descriptor: Option<&'s str>,
pub receipt_url: Option<&'s str>,
}
impl<'s> StripeCharge<'s> {
pub fn is_successful(&self) -> bool {
matches!(self.status, StripeChargeStatus::Succeeded) && self.paid
}
pub fn formatted_amount(&self) -> String {
let symbol = match self.currency {
StripeCurrency::USD => "$",
StripeCurrency::CAD => "CA$\u{a0}",
StripeCurrency::EUR => "€",
StripeCurrency::GBP => "£",
};
let amount = self.amount as f64 / 100.0;
format!("{}{:.2}", symbol, amount)
}
}