1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
use client::Client;
use error::Error;
use params::{Identifiable, List, Metadata, Timestamp};
use resources::{Discount, Plan};
use serde_qs as qs;
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct CancelParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub at_period_end: Option<bool>,
}
#[derive(Clone, Serialize, Debug)]
pub struct ItemParams<'a> {
pub plan: &'a str,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<u64>,
}
#[derive(Clone, Default, Serialize, Debug)]
pub struct SubscriptionParams<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub customer: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub application_fee_percent: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coupon: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Vec<ItemParams<'a>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan: Option<&'a str>,
#[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 source: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_percent: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial_end: Option<TrialEnd<'a>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial_period_days: Option<u64>,
}
#[derive(Clone, Serialize, Debug)]
#[serde(untagged)]
pub enum TrialEnd<'a> {
Timestamp(Timestamp),
Special(&'a str),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubscriptionItem {
pub id: String,
pub created: Timestamp,
pub plan: Plan,
pub quantity: u64,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Subscription {
pub id: String,
pub application_fee_percent: Option<f64>,
pub cancel_at_period_end: bool,
pub canceled_at: Option<Timestamp>,
pub created: Option<Timestamp>,
pub current_period_start: Timestamp,
pub current_period_end: Timestamp,
pub customer: String,
pub discount: Option<Discount>,
pub ended_at: Option<Timestamp>,
pub items: List<SubscriptionItem>,
pub livemode: bool,
pub metadata: Metadata,
pub plan: Plan,
pub quantity: u64,
pub start: Timestamp,
pub status: String,
pub tax_percent: Option<f64>,
pub trial_start: Option<Timestamp>,
pub trial_end: Option<Timestamp>,
}
impl Subscription {
pub fn create(client: &Client, params: SubscriptionParams) -> Result<Subscription, Error> {
client.post("/subscriptions", params)
}
pub fn retrieve(client: &Client, subscription_id: &str) -> Result<Subscription, Error> {
client.get(&format!("/subscriptions/{}", subscription_id))
}
pub fn update(
client: &Client,
subscription_id: &str,
params: SubscriptionParams,
) -> Result<Subscription, Error> {
client.post(&format!("/subscriptions/{}", subscription_id), params)
}
pub fn cancel(
client: &Client,
subscription_id: &str,
params: CancelParams,
) -> Result<Subscription, Error> {
client.delete(&format!("/subscriptions/{}?{}", subscription_id, qs::to_string(¶ms)?))
}
}
impl Identifiable for Subscription {
fn id(&self) -> &str {
&self.id
}
}