use serde::{Deserialize, Serialize};
use std::fmt;
use std::str::FromStr;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Event {
BookingCancelled,
BookingRescheduled,
CashAppPaymentRequiresAttention,
ChargeCompleted,
ChargeCreated,
ChargeDisputed,
ChargePartialPaid,
ChargeReview,
FeedbackCreated,
OrderCompleted,
OrderCreated,
OrderDisputed,
OrderManualPaymentCompleted,
OrderPaid,
OrderPartialPaid,
ProductCreated,
ProductTrashed,
ProductUpdated,
SubscriptionCancelled,
SubscriptionCreated,
SubscriptionRenewed,
TicketMessageCreated,
VariantCreated,
VariantSoldOut,
VariantUpdated,
Unknown(String),
}
impl Event {
#[allow(deprecated)]
pub fn as_str(&self) -> &str {
match self {
Self::BookingCancelled => "booking.cancelled",
Self::BookingRescheduled => "booking.rescheduled",
Self::CashAppPaymentRequiresAttention => "cash_app.payment_requires_attention",
Self::ChargeCompleted => "charge.completed",
Self::ChargeCreated => "charge.created",
Self::ChargeDisputed => "charge.disputed",
Self::ChargePartialPaid => "charge.partial_paid",
Self::ChargeReview => "charge.review",
Self::FeedbackCreated => "feedback.created",
Self::OrderCompleted => "order.completed",
Self::OrderCreated => "order.created",
Self::OrderDisputed => "order.disputed",
Self::OrderManualPaymentCompleted => "order.manual_payment_completed",
Self::OrderPaid => "order.paid",
Self::OrderPartialPaid => "order.partial_paid",
Self::ProductCreated => "product.created",
Self::ProductTrashed => "product.trashed",
Self::ProductUpdated => "product.updated",
Self::SubscriptionCancelled => "subscription.cancelled",
Self::SubscriptionCreated => "subscription.created",
Self::SubscriptionRenewed => "subscription.renewed",
Self::TicketMessageCreated => "ticket_message.created",
Self::VariantCreated => "variant.created",
Self::VariantSoldOut => "variant.sold_out",
Self::VariantUpdated => "variant.updated",
Self::Unknown(s) => s.as_str(),
}
}
pub fn is_known(&self) -> bool {
!matches!(self, Self::Unknown(_))
}
}
impl fmt::Display for Event {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl AsRef<str> for Event {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl FromStr for Event {
type Err = std::convert::Infallible;
#[allow(deprecated)]
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"booking.cancelled" => Self::BookingCancelled,
"booking.rescheduled" => Self::BookingRescheduled,
"cash_app.payment_requires_attention" => Self::CashAppPaymentRequiresAttention,
"charge.completed" => Self::ChargeCompleted,
"charge.created" => Self::ChargeCreated,
"charge.disputed" => Self::ChargeDisputed,
"charge.partial_paid" => Self::ChargePartialPaid,
"charge.review" => Self::ChargeReview,
"feedback.created" => Self::FeedbackCreated,
"order.completed" => Self::OrderCompleted,
"order.created" => Self::OrderCreated,
"order.disputed" => Self::OrderDisputed,
"order.manual_payment_completed" => Self::OrderManualPaymentCompleted,
"order.paid" => Self::OrderPaid,
"order.partial_paid" => Self::OrderPartialPaid,
"product.created" => Self::ProductCreated,
"product.trashed" => Self::ProductTrashed,
"product.updated" => Self::ProductUpdated,
"subscription.cancelled" => Self::SubscriptionCancelled,
"subscription.created" => Self::SubscriptionCreated,
"subscription.renewed" => Self::SubscriptionRenewed,
"ticket_message.created" => Self::TicketMessageCreated,
"variant.created" => Self::VariantCreated,
"variant.sold_out" => Self::VariantSoldOut,
"variant.updated" => Self::VariantUpdated,
other => Self::Unknown(other.to_string()),
})
}
}
impl From<String> for Event {
fn from(s: String) -> Self {
match Self::from_str(&s) {
Ok(Self::Unknown(_)) => Self::Unknown(s),
Ok(other) => other,
}
}
}
impl From<&str> for Event {
fn from(s: &str) -> Self {
Self::from_str(s).unwrap_or_else(|_| Self::Unknown(s.to_string()))
}
}
impl Serialize for Event {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for Event {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let s = String::deserialize(deserializer)?;
Ok(Self::from(s))
}
}