#[derive(Clone)]
#[cfg_attr(not(feature = "redact-generated-debug"), derive(Debug))]
#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))]
pub struct Charge {
pub amount: i64,
pub amount_captured: i64,
pub amount_refunded: i64,
pub application: Option<stripe_types::Expandable<stripe_shared::Application>>,
pub application_fee: Option<stripe_types::Expandable<stripe_shared::ApplicationFee>>,
pub application_fee_amount: Option<i64>,
pub authorization_code: Option<String>,
pub balance_transaction: Option<stripe_types::Expandable<stripe_shared::BalanceTransaction>>,
pub billing_details: stripe_shared::BillingDetails,
pub calculated_statement_descriptor: Option<String>,
pub captured: bool,
pub created: stripe_types::Timestamp,
pub currency: stripe_types::Currency,
pub customer: Option<stripe_types::Expandable<stripe_shared::Customer>>,
pub description: Option<String>,
pub disputed: bool,
pub failure_balance_transaction:
Option<stripe_types::Expandable<stripe_shared::BalanceTransaction>>,
pub failure_code: Option<String>,
pub failure_message: Option<String>,
pub fraud_details: Option<stripe_shared::ChargeFraudDetails>,
pub id: stripe_shared::ChargeId,
pub level3: Option<stripe_shared::Level3>,
pub livemode: bool,
pub metadata: std::collections::HashMap<String, String>,
pub on_behalf_of: Option<stripe_types::Expandable<stripe_shared::Account>>,
pub outcome: Option<stripe_shared::ChargeOutcome>,
pub paid: bool,
pub payment_intent: Option<stripe_types::Expandable<stripe_shared::PaymentIntent>>,
pub payment_method: Option<String>,
pub payment_method_details: Option<stripe_shared::PaymentMethodDetails>,
pub presentment_details: Option<stripe_shared::PaymentFlowsPaymentIntentPresentmentDetails>,
pub radar_options: Option<stripe_shared::RadarRadarOptions>,
pub receipt_email: Option<String>,
pub receipt_number: Option<String>,
pub receipt_url: Option<String>,
pub refunded: bool,
pub refunds: Option<stripe_types::List<stripe_shared::Refund>>,
pub review: Option<stripe_types::Expandable<stripe_shared::Review>>,
pub shipping: Option<stripe_shared::Shipping>,
pub source: Option<stripe_shared::PaymentSource>,
pub source_transfer: Option<stripe_types::Expandable<stripe_shared::Transfer>>,
pub statement_descriptor: Option<String>,
pub statement_descriptor_suffix: Option<String>,
pub status: ChargeStatus,
pub transfer: Option<stripe_types::Expandable<stripe_shared::Transfer>>,
pub transfer_data: Option<stripe_shared::ChargeTransferData>,
pub transfer_group: Option<String>,
}
#[cfg(feature = "redact-generated-debug")]
impl std::fmt::Debug for Charge {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.debug_struct("Charge").finish_non_exhaustive()
}
}
#[doc(hidden)]
pub struct ChargeBuilder {
amount: Option<i64>,
amount_captured: Option<i64>,
amount_refunded: Option<i64>,
application: Option<Option<stripe_types::Expandable<stripe_shared::Application>>>,
application_fee: Option<Option<stripe_types::Expandable<stripe_shared::ApplicationFee>>>,
application_fee_amount: Option<Option<i64>>,
authorization_code: Option<Option<String>>,
balance_transaction:
Option<Option<stripe_types::Expandable<stripe_shared::BalanceTransaction>>>,
billing_details: Option<stripe_shared::BillingDetails>,
calculated_statement_descriptor: Option<Option<String>>,
captured: Option<bool>,
created: Option<stripe_types::Timestamp>,
currency: Option<stripe_types::Currency>,
customer: Option<Option<stripe_types::Expandable<stripe_shared::Customer>>>,
description: Option<Option<String>>,
disputed: Option<bool>,
failure_balance_transaction:
Option<Option<stripe_types::Expandable<stripe_shared::BalanceTransaction>>>,
failure_code: Option<Option<String>>,
failure_message: Option<Option<String>>,
fraud_details: Option<Option<stripe_shared::ChargeFraudDetails>>,
id: Option<stripe_shared::ChargeId>,
level3: Option<Option<stripe_shared::Level3>>,
livemode: Option<bool>,
metadata: Option<std::collections::HashMap<String, String>>,
on_behalf_of: Option<Option<stripe_types::Expandable<stripe_shared::Account>>>,
outcome: Option<Option<stripe_shared::ChargeOutcome>>,
paid: Option<bool>,
payment_intent: Option<Option<stripe_types::Expandable<stripe_shared::PaymentIntent>>>,
payment_method: Option<Option<String>>,
payment_method_details: Option<Option<stripe_shared::PaymentMethodDetails>>,
presentment_details: Option<Option<stripe_shared::PaymentFlowsPaymentIntentPresentmentDetails>>,
radar_options: Option<Option<stripe_shared::RadarRadarOptions>>,
receipt_email: Option<Option<String>>,
receipt_number: Option<Option<String>>,
receipt_url: Option<Option<String>>,
refunded: Option<bool>,
refunds: Option<Option<stripe_types::List<stripe_shared::Refund>>>,
review: Option<Option<stripe_types::Expandable<stripe_shared::Review>>>,
shipping: Option<Option<stripe_shared::Shipping>>,
source: Option<Option<stripe_shared::PaymentSource>>,
source_transfer: Option<Option<stripe_types::Expandable<stripe_shared::Transfer>>>,
statement_descriptor: Option<Option<String>>,
statement_descriptor_suffix: Option<Option<String>>,
status: Option<ChargeStatus>,
transfer: Option<Option<stripe_types::Expandable<stripe_shared::Transfer>>>,
transfer_data: Option<Option<stripe_shared::ChargeTransferData>>,
transfer_group: Option<Option<String>>,
}
#[allow(
unused_variables,
irrefutable_let_patterns,
clippy::let_unit_value,
clippy::match_single_binding,
clippy::single_match
)]
const _: () = {
use miniserde::de::{Map, Visitor};
use miniserde::json::Value;
use miniserde::{Deserialize, Result, make_place};
use stripe_types::miniserde_helpers::FromValueOpt;
use stripe_types::{MapBuilder, ObjectDeser};
make_place!(Place);
impl Deserialize for Charge {
fn begin(out: &mut Option<Self>) -> &mut dyn Visitor {
Place::new(out)
}
}
struct Builder<'a> {
out: &'a mut Option<Charge>,
builder: ChargeBuilder,
}
impl Visitor for Place<Charge> {
fn map(&mut self) -> Result<Box<dyn Map + '_>> {
Ok(Box::new(Builder { out: &mut self.out, builder: ChargeBuilder::deser_default() }))
}
}
impl MapBuilder for ChargeBuilder {
type Out = Charge;
fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
Ok(match k {
"amount" => Deserialize::begin(&mut self.amount),
"amount_captured" => Deserialize::begin(&mut self.amount_captured),
"amount_refunded" => Deserialize::begin(&mut self.amount_refunded),
"application" => Deserialize::begin(&mut self.application),
"application_fee" => Deserialize::begin(&mut self.application_fee),
"application_fee_amount" => Deserialize::begin(&mut self.application_fee_amount),
"authorization_code" => Deserialize::begin(&mut self.authorization_code),
"balance_transaction" => Deserialize::begin(&mut self.balance_transaction),
"billing_details" => Deserialize::begin(&mut self.billing_details),
"calculated_statement_descriptor" => {
Deserialize::begin(&mut self.calculated_statement_descriptor)
}
"captured" => Deserialize::begin(&mut self.captured),
"created" => Deserialize::begin(&mut self.created),
"currency" => Deserialize::begin(&mut self.currency),
"customer" => Deserialize::begin(&mut self.customer),
"description" => Deserialize::begin(&mut self.description),
"disputed" => Deserialize::begin(&mut self.disputed),
"failure_balance_transaction" => {
Deserialize::begin(&mut self.failure_balance_transaction)
}
"failure_code" => Deserialize::begin(&mut self.failure_code),
"failure_message" => Deserialize::begin(&mut self.failure_message),
"fraud_details" => Deserialize::begin(&mut self.fraud_details),
"id" => Deserialize::begin(&mut self.id),
"level3" => Deserialize::begin(&mut self.level3),
"livemode" => Deserialize::begin(&mut self.livemode),
"metadata" => Deserialize::begin(&mut self.metadata),
"on_behalf_of" => Deserialize::begin(&mut self.on_behalf_of),
"outcome" => Deserialize::begin(&mut self.outcome),
"paid" => Deserialize::begin(&mut self.paid),
"payment_intent" => Deserialize::begin(&mut self.payment_intent),
"payment_method" => Deserialize::begin(&mut self.payment_method),
"payment_method_details" => Deserialize::begin(&mut self.payment_method_details),
"presentment_details" => Deserialize::begin(&mut self.presentment_details),
"radar_options" => Deserialize::begin(&mut self.radar_options),
"receipt_email" => Deserialize::begin(&mut self.receipt_email),
"receipt_number" => Deserialize::begin(&mut self.receipt_number),
"receipt_url" => Deserialize::begin(&mut self.receipt_url),
"refunded" => Deserialize::begin(&mut self.refunded),
"refunds" => Deserialize::begin(&mut self.refunds),
"review" => Deserialize::begin(&mut self.review),
"shipping" => Deserialize::begin(&mut self.shipping),
"source" => Deserialize::begin(&mut self.source),
"source_transfer" => Deserialize::begin(&mut self.source_transfer),
"statement_descriptor" => Deserialize::begin(&mut self.statement_descriptor),
"statement_descriptor_suffix" => {
Deserialize::begin(&mut self.statement_descriptor_suffix)
}
"status" => Deserialize::begin(&mut self.status),
"transfer" => Deserialize::begin(&mut self.transfer),
"transfer_data" => Deserialize::begin(&mut self.transfer_data),
"transfer_group" => Deserialize::begin(&mut self.transfer_group),
_ => <dyn Visitor>::ignore(),
})
}
fn deser_default() -> Self {
Self {
amount: None,
amount_captured: None,
amount_refunded: None,
application: Some(None),
application_fee: Some(None),
application_fee_amount: Some(None),
authorization_code: Some(None),
balance_transaction: Some(None),
billing_details: None,
calculated_statement_descriptor: Some(None),
captured: None,
created: None,
currency: None,
customer: Some(None),
description: Some(None),
disputed: None,
failure_balance_transaction: Some(None),
failure_code: Some(None),
failure_message: Some(None),
fraud_details: Some(None),
id: None,
level3: Some(None),
livemode: None,
metadata: None,
on_behalf_of: Some(None),
outcome: Some(None),
paid: None,
payment_intent: Some(None),
payment_method: Some(None),
payment_method_details: Some(None),
presentment_details: Some(None),
radar_options: Some(None),
receipt_email: Some(None),
receipt_number: Some(None),
receipt_url: Some(None),
refunded: None,
refunds: Some(None),
review: Some(None),
shipping: Some(None),
source: Some(None),
source_transfer: Some(None),
statement_descriptor: Some(None),
statement_descriptor_suffix: Some(None),
status: None,
transfer: Some(None),
transfer_data: Some(None),
transfer_group: Some(None),
}
}
fn take_out(&mut self) -> Option<Self::Out> {
let (
Some(amount),
Some(amount_captured),
Some(amount_refunded),
Some(application),
Some(application_fee),
Some(application_fee_amount),
Some(authorization_code),
Some(balance_transaction),
Some(billing_details),
Some(calculated_statement_descriptor),
Some(captured),
Some(created),
Some(currency),
Some(customer),
Some(description),
Some(disputed),
Some(failure_balance_transaction),
Some(failure_code),
Some(failure_message),
Some(fraud_details),
Some(id),
Some(level3),
Some(livemode),
Some(metadata),
Some(on_behalf_of),
Some(outcome),
Some(paid),
Some(payment_intent),
Some(payment_method),
Some(payment_method_details),
Some(presentment_details),
Some(radar_options),
Some(receipt_email),
Some(receipt_number),
Some(receipt_url),
Some(refunded),
Some(refunds),
Some(review),
Some(shipping),
Some(source),
Some(source_transfer),
Some(statement_descriptor),
Some(statement_descriptor_suffix),
Some(status),
Some(transfer),
Some(transfer_data),
Some(transfer_group),
) = (
self.amount,
self.amount_captured,
self.amount_refunded,
self.application.take(),
self.application_fee.take(),
self.application_fee_amount,
self.authorization_code.take(),
self.balance_transaction.take(),
self.billing_details.take(),
self.calculated_statement_descriptor.take(),
self.captured,
self.created,
self.currency.take(),
self.customer.take(),
self.description.take(),
self.disputed,
self.failure_balance_transaction.take(),
self.failure_code.take(),
self.failure_message.take(),
self.fraud_details.take(),
self.id.take(),
self.level3.take(),
self.livemode,
self.metadata.take(),
self.on_behalf_of.take(),
self.outcome.take(),
self.paid,
self.payment_intent.take(),
self.payment_method.take(),
self.payment_method_details.take(),
self.presentment_details.take(),
self.radar_options.take(),
self.receipt_email.take(),
self.receipt_number.take(),
self.receipt_url.take(),
self.refunded,
self.refunds.take(),
self.review.take(),
self.shipping.take(),
self.source.take(),
self.source_transfer.take(),
self.statement_descriptor.take(),
self.statement_descriptor_suffix.take(),
self.status.take(),
self.transfer.take(),
self.transfer_data.take(),
self.transfer_group.take(),
)
else {
return None;
};
Some(Self::Out {
amount,
amount_captured,
amount_refunded,
application,
application_fee,
application_fee_amount,
authorization_code,
balance_transaction,
billing_details,
calculated_statement_descriptor,
captured,
created,
currency,
customer,
description,
disputed,
failure_balance_transaction,
failure_code,
failure_message,
fraud_details,
id,
level3,
livemode,
metadata,
on_behalf_of,
outcome,
paid,
payment_intent,
payment_method,
payment_method_details,
presentment_details,
radar_options,
receipt_email,
receipt_number,
receipt_url,
refunded,
refunds,
review,
shipping,
source,
source_transfer,
statement_descriptor,
statement_descriptor_suffix,
status,
transfer,
transfer_data,
transfer_group,
})
}
}
impl Map for Builder<'_> {
fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
self.builder.key(k)
}
fn finish(&mut self) -> Result<()> {
*self.out = self.builder.take_out();
Ok(())
}
}
impl ObjectDeser for Charge {
type Builder = ChargeBuilder;
}
impl FromValueOpt for Charge {
fn from_value(v: Value) -> Option<Self> {
let Value::Object(obj) = v else {
return None;
};
let mut b = ChargeBuilder::deser_default();
for (k, v) in obj {
match k.as_str() {
"amount" => b.amount = FromValueOpt::from_value(v),
"amount_captured" => b.amount_captured = FromValueOpt::from_value(v),
"amount_refunded" => b.amount_refunded = FromValueOpt::from_value(v),
"application" => b.application = FromValueOpt::from_value(v),
"application_fee" => b.application_fee = FromValueOpt::from_value(v),
"application_fee_amount" => {
b.application_fee_amount = FromValueOpt::from_value(v)
}
"authorization_code" => b.authorization_code = FromValueOpt::from_value(v),
"balance_transaction" => b.balance_transaction = FromValueOpt::from_value(v),
"billing_details" => b.billing_details = FromValueOpt::from_value(v),
"calculated_statement_descriptor" => {
b.calculated_statement_descriptor = FromValueOpt::from_value(v)
}
"captured" => b.captured = FromValueOpt::from_value(v),
"created" => b.created = FromValueOpt::from_value(v),
"currency" => b.currency = FromValueOpt::from_value(v),
"customer" => b.customer = FromValueOpt::from_value(v),
"description" => b.description = FromValueOpt::from_value(v),
"disputed" => b.disputed = FromValueOpt::from_value(v),
"failure_balance_transaction" => {
b.failure_balance_transaction = FromValueOpt::from_value(v)
}
"failure_code" => b.failure_code = FromValueOpt::from_value(v),
"failure_message" => b.failure_message = FromValueOpt::from_value(v),
"fraud_details" => b.fraud_details = FromValueOpt::from_value(v),
"id" => b.id = FromValueOpt::from_value(v),
"level3" => b.level3 = FromValueOpt::from_value(v),
"livemode" => b.livemode = FromValueOpt::from_value(v),
"metadata" => b.metadata = FromValueOpt::from_value(v),
"on_behalf_of" => b.on_behalf_of = FromValueOpt::from_value(v),
"outcome" => b.outcome = FromValueOpt::from_value(v),
"paid" => b.paid = FromValueOpt::from_value(v),
"payment_intent" => b.payment_intent = FromValueOpt::from_value(v),
"payment_method" => b.payment_method = FromValueOpt::from_value(v),
"payment_method_details" => {
b.payment_method_details = FromValueOpt::from_value(v)
}
"presentment_details" => b.presentment_details = FromValueOpt::from_value(v),
"radar_options" => b.radar_options = FromValueOpt::from_value(v),
"receipt_email" => b.receipt_email = FromValueOpt::from_value(v),
"receipt_number" => b.receipt_number = FromValueOpt::from_value(v),
"receipt_url" => b.receipt_url = FromValueOpt::from_value(v),
"refunded" => b.refunded = FromValueOpt::from_value(v),
"refunds" => b.refunds = FromValueOpt::from_value(v),
"review" => b.review = FromValueOpt::from_value(v),
"shipping" => b.shipping = FromValueOpt::from_value(v),
"source" => b.source = FromValueOpt::from_value(v),
"source_transfer" => b.source_transfer = FromValueOpt::from_value(v),
"statement_descriptor" => b.statement_descriptor = FromValueOpt::from_value(v),
"statement_descriptor_suffix" => {
b.statement_descriptor_suffix = FromValueOpt::from_value(v)
}
"status" => b.status = FromValueOpt::from_value(v),
"transfer" => b.transfer = FromValueOpt::from_value(v),
"transfer_data" => b.transfer_data = FromValueOpt::from_value(v),
"transfer_group" => b.transfer_group = FromValueOpt::from_value(v),
_ => {}
}
}
b.take_out()
}
}
};
#[cfg(feature = "serialize")]
impl serde::Serialize for Charge {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeStruct;
let mut s = s.serialize_struct("Charge", 48)?;
s.serialize_field("amount", &self.amount)?;
s.serialize_field("amount_captured", &self.amount_captured)?;
s.serialize_field("amount_refunded", &self.amount_refunded)?;
s.serialize_field("application", &self.application)?;
s.serialize_field("application_fee", &self.application_fee)?;
s.serialize_field("application_fee_amount", &self.application_fee_amount)?;
s.serialize_field("authorization_code", &self.authorization_code)?;
s.serialize_field("balance_transaction", &self.balance_transaction)?;
s.serialize_field("billing_details", &self.billing_details)?;
s.serialize_field(
"calculated_statement_descriptor",
&self.calculated_statement_descriptor,
)?;
s.serialize_field("captured", &self.captured)?;
s.serialize_field("created", &self.created)?;
s.serialize_field("currency", &self.currency)?;
s.serialize_field("customer", &self.customer)?;
s.serialize_field("description", &self.description)?;
s.serialize_field("disputed", &self.disputed)?;
s.serialize_field("failure_balance_transaction", &self.failure_balance_transaction)?;
s.serialize_field("failure_code", &self.failure_code)?;
s.serialize_field("failure_message", &self.failure_message)?;
s.serialize_field("fraud_details", &self.fraud_details)?;
s.serialize_field("id", &self.id)?;
s.serialize_field("level3", &self.level3)?;
s.serialize_field("livemode", &self.livemode)?;
s.serialize_field("metadata", &self.metadata)?;
s.serialize_field("on_behalf_of", &self.on_behalf_of)?;
s.serialize_field("outcome", &self.outcome)?;
s.serialize_field("paid", &self.paid)?;
s.serialize_field("payment_intent", &self.payment_intent)?;
s.serialize_field("payment_method", &self.payment_method)?;
s.serialize_field("payment_method_details", &self.payment_method_details)?;
s.serialize_field("presentment_details", &self.presentment_details)?;
s.serialize_field("radar_options", &self.radar_options)?;
s.serialize_field("receipt_email", &self.receipt_email)?;
s.serialize_field("receipt_number", &self.receipt_number)?;
s.serialize_field("receipt_url", &self.receipt_url)?;
s.serialize_field("refunded", &self.refunded)?;
s.serialize_field("refunds", &self.refunds)?;
s.serialize_field("review", &self.review)?;
s.serialize_field("shipping", &self.shipping)?;
s.serialize_field("source", &self.source)?;
s.serialize_field("source_transfer", &self.source_transfer)?;
s.serialize_field("statement_descriptor", &self.statement_descriptor)?;
s.serialize_field("statement_descriptor_suffix", &self.statement_descriptor_suffix)?;
s.serialize_field("status", &self.status)?;
s.serialize_field("transfer", &self.transfer)?;
s.serialize_field("transfer_data", &self.transfer_data)?;
s.serialize_field("transfer_group", &self.transfer_group)?;
s.serialize_field("object", "charge")?;
s.end()
}
}
#[derive(Clone, Eq, PartialEq)]
#[non_exhaustive]
pub enum ChargeStatus {
Failed,
Pending,
Succeeded,
Unknown(String),
}
impl ChargeStatus {
pub fn as_str(&self) -> &str {
use ChargeStatus::*;
match self {
Failed => "failed",
Pending => "pending",
Succeeded => "succeeded",
Unknown(v) => v,
}
}
}
impl std::str::FromStr for ChargeStatus {
type Err = std::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
use ChargeStatus::*;
match s {
"failed" => Ok(Failed),
"pending" => Ok(Pending),
"succeeded" => Ok(Succeeded),
v => {
tracing::warn!("Unknown value '{}' for enum '{}'", v, "ChargeStatus");
Ok(Unknown(v.to_owned()))
}
}
}
}
impl std::fmt::Display for ChargeStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(not(feature = "redact-generated-debug"))]
impl std::fmt::Debug for ChargeStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(feature = "redact-generated-debug")]
impl std::fmt::Debug for ChargeStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.debug_struct(stringify!(ChargeStatus)).finish_non_exhaustive()
}
}
#[cfg(feature = "serialize")]
impl serde::Serialize for ChargeStatus {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(self.as_str())
}
}
impl miniserde::Deserialize for ChargeStatus {
fn begin(out: &mut Option<Self>) -> &mut dyn miniserde::de::Visitor {
crate::Place::new(out)
}
}
impl miniserde::de::Visitor for crate::Place<ChargeStatus> {
fn string(&mut self, s: &str) -> miniserde::Result<()> {
use std::str::FromStr;
self.out = Some(ChargeStatus::from_str(s).expect("infallible"));
Ok(())
}
}
stripe_types::impl_from_val_with_from_str!(ChargeStatus);
#[cfg(feature = "deserialize")]
impl<'de> serde::Deserialize<'de> for ChargeStatus {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
use std::str::FromStr;
let s: std::borrow::Cow<'de, str> = serde::Deserialize::deserialize(deserializer)?;
Ok(Self::from_str(&s).expect("infallible"))
}
}
impl stripe_types::Object for Charge {
type Id = stripe_shared::ChargeId;
fn id(&self) -> &Self::Id {
&self.id
}
fn into_id(self) -> Self::Id {
self.id
}
}
stripe_types::def_id!(ChargeId);