use crate::config::{Client, Response};
use crate::ids::{PlanId, SubscriptionId, SubscriptionItemId};
use crate::params::{Deleted, Expand, List, Metadata, Object, Timestamp};
use crate::resources::{Plan, SubscriptionItemBillingThresholds, TaxRate};
use serde_derive::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionItem {
pub id: SubscriptionItemId,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionItemBillingThresholds>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<Timestamp>,
#[serde(default)]
pub deleted: bool,
#[serde(default)]
pub metadata: Metadata,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan: Option<Plan>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_rates: Option<Vec<TaxRate>>,
}
impl SubscriptionItem {
pub fn list(
client: &Client,
params: ListSubscriptionItems<'_>,
) -> Response<List<SubscriptionItem>> {
client.get_query("/subscription_items", ¶ms)
}
pub fn create(
client: &Client,
params: CreateSubscriptionItem<'_>,
) -> Response<SubscriptionItem> {
client.post_form("/subscription_items", ¶ms)
}
pub fn retrieve(
client: &Client,
id: &SubscriptionItemId,
expand: &[&str],
) -> Response<SubscriptionItem> {
client.get_query(&format!("/subscription_items/{}", id), &Expand { expand })
}
pub fn update(
client: &Client,
id: &SubscriptionItemId,
params: UpdateSubscriptionItem<'_>,
) -> Response<SubscriptionItem> {
client.post_form(&format!("/subscription_items/{}", id), ¶ms)
}
pub fn delete(
client: &Client,
id: &SubscriptionItemId,
) -> Response<Deleted<SubscriptionItemId>> {
client.delete(&format!("/subscription_items/{}", id))
}
}
impl Object for SubscriptionItem {
type Id = SubscriptionItemId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"subscription_item"
}
}
#[derive(Clone, Debug, Serialize)]
pub struct CreateSubscriptionItem<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<CreateSubscriptionItemBillingThresholds>,
#[serde(skip_serializing_if = "Expand::is_empty")]
pub expand: &'a [&'a str],
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
pub plan: PlanId,
#[serde(skip_serializing_if = "Option::is_none")]
pub prorate: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub proration_date: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<u64>,
pub subscription: SubscriptionId,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_rates: Option<Vec<String>>,
}
impl<'a> CreateSubscriptionItem<'a> {
pub fn new(plan: PlanId, subscription: SubscriptionId) -> Self {
CreateSubscriptionItem {
billing_thresholds: Default::default(),
expand: Default::default(),
metadata: Default::default(),
plan,
prorate: Default::default(),
proration_date: Default::default(),
quantity: Default::default(),
subscription,
tax_rates: Default::default(),
}
}
}
#[derive(Clone, Debug, Serialize)]
pub struct ListSubscriptionItems<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub ending_before: Option<SubscriptionItemId>,
#[serde(skip_serializing_if = "Expand::is_empty")]
pub expand: &'a [&'a str],
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starting_after: Option<SubscriptionItemId>,
pub subscription: SubscriptionId,
}
impl<'a> ListSubscriptionItems<'a> {
pub fn new(subscription: SubscriptionId) -> Self {
ListSubscriptionItems {
ending_before: Default::default(),
expand: Default::default(),
limit: Default::default(),
starting_after: Default::default(),
subscription,
}
}
}
#[derive(Clone, Debug, Serialize, Default)]
pub struct UpdateSubscriptionItem<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub billing_thresholds: Option<SubscriptionItemBillingThresholds>,
#[serde(skip_serializing_if = "Expand::is_empty")]
pub expand: &'a [&'a str],
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub off_session: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payment_behavior: Option<SubscriptionItemPaymentBehavior>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan: Option<PlanId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prorate: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub proration_date: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_rates: Option<Vec<String>>,
}
impl<'a> UpdateSubscriptionItem<'a> {
pub fn new() -> Self {
UpdateSubscriptionItem {
billing_thresholds: Default::default(),
expand: Default::default(),
metadata: Default::default(),
off_session: Default::default(),
payment_behavior: Default::default(),
plan: Default::default(),
prorate: Default::default(),
proration_date: Default::default(),
quantity: Default::default(),
tax_rates: Default::default(),
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct CreateSubscriptionItemBillingThresholds {
pub usage_gte: i64,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum SubscriptionItemPaymentBehavior {
AllowIncomplete,
ErrorIfIncomplete,
}
impl SubscriptionItemPaymentBehavior {
pub fn as_str(self) -> &'static str {
match self {
SubscriptionItemPaymentBehavior::AllowIncomplete => "allow_incomplete",
SubscriptionItemPaymentBehavior::ErrorIfIncomplete => "error_if_incomplete",
}
}
}
impl AsRef<str> for SubscriptionItemPaymentBehavior {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for SubscriptionItemPaymentBehavior {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}