1use crate::client::{Client, Response};
6use crate::ids::PlanId;
7use crate::params::{
8 Deleted, Expand, Expandable, IdOrCreate, List, Metadata, Object, Paginable, RangeQuery,
9 Timestamp,
10};
11use crate::resources::{CreateProduct, Currency, Product};
12use serde::{Deserialize, Serialize};
13
14#[derive(Clone, Debug, Default, Deserialize, Serialize)]
18pub struct Plan {
19 pub id: PlanId,
21
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub active: Option<bool>,
25
26 #[serde(skip_serializing_if = "Option::is_none")]
31 pub aggregate_usage: Option<PlanAggregateUsage>,
32
33 #[serde(skip_serializing_if = "Option::is_none")]
37 pub amount: Option<i64>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
43 pub amount_decimal: Option<String>,
44
45 #[serde(skip_serializing_if = "Option::is_none")]
51 pub billing_scheme: Option<PlanBillingScheme>,
52
53 #[serde(skip_serializing_if = "Option::is_none")]
57 pub created: Option<Timestamp>,
58
59 #[serde(skip_serializing_if = "Option::is_none")]
63 pub currency: Option<Currency>,
64
65 #[serde(default)]
67 pub deleted: bool,
68
69 #[serde(skip_serializing_if = "Option::is_none")]
73 pub interval: Option<PlanInterval>,
74
75 #[serde(skip_serializing_if = "Option::is_none")]
79 pub interval_count: Option<u64>,
80
81 #[serde(skip_serializing_if = "Option::is_none")]
83 pub livemode: Option<bool>,
84
85 #[serde(skip_serializing_if = "Option::is_none")]
89 pub metadata: Option<Metadata>,
90
91 #[serde(skip_serializing_if = "Option::is_none")]
93 pub nickname: Option<String>,
94
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub product: Option<Expandable<Product>>,
98
99 #[serde(skip_serializing_if = "Option::is_none")]
104 pub tiers: Option<Vec<PlanTier>>,
105
106 #[serde(skip_serializing_if = "Option::is_none")]
111 pub tiers_mode: Option<PlanTiersMode>,
112
113 #[serde(skip_serializing_if = "Option::is_none")]
117 pub transform_usage: Option<TransformUsage>,
118
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub trial_period_days: Option<u32>,
122
123 #[serde(skip_serializing_if = "Option::is_none")]
130 pub usage_type: Option<PlanUsageType>,
131}
132
133impl Plan {
134 pub fn list(client: &Client, params: &ListPlans<'_>) -> Response<List<Plan>> {
136 client.get_query("/plans", params)
137 }
138
139 pub fn retrieve(client: &Client, id: &PlanId, expand: &[&str]) -> Response<Plan> {
141 client.get_query(&format!("/plans/{}", id), Expand { expand })
142 }
143
144 pub fn update(client: &Client, id: &PlanId, params: UpdatePlan<'_>) -> Response<Plan> {
149 #[allow(clippy::needless_borrows_for_generic_args)]
150 client.post_form(&format!("/plans/{}", id), ¶ms)
151 }
152
153 pub fn delete(client: &Client, id: &PlanId) -> Response<Deleted<PlanId>> {
157 client.delete(&format!("/plans/{}", id))
158 }
159}
160
161impl Object for Plan {
162 type Id = PlanId;
163 fn id(&self) -> Self::Id {
164 self.id.clone()
165 }
166 fn object(&self) -> &'static str {
167 "plan"
168 }
169}
170
171#[derive(Clone, Debug, Default, Deserialize, Serialize)]
172pub struct PlanTier {
173 pub flat_amount: Option<i64>,
175
176 pub flat_amount_decimal: Option<String>,
178
179 pub unit_amount: Option<i64>,
181
182 pub unit_amount_decimal: Option<String>,
184
185 pub up_to: Option<i64>,
187}
188
189#[derive(Clone, Debug, Default, Deserialize, Serialize)]
190pub struct TransformUsage {
191 pub divide_by: i64,
193
194 pub round: TransformUsageRound,
196}
197
198#[derive(Clone, Debug, Serialize, Default)]
200pub struct ListPlans<'a> {
201 #[serde(skip_serializing_if = "Option::is_none")]
203 pub active: Option<bool>,
204
205 #[serde(skip_serializing_if = "Option::is_none")]
209 pub created: Option<RangeQuery<Timestamp>>,
210
211 #[serde(skip_serializing_if = "Option::is_none")]
216 pub ending_before: Option<PlanId>,
217
218 #[serde(skip_serializing_if = "Expand::is_empty")]
220 pub expand: &'a [&'a str],
221
222 #[serde(skip_serializing_if = "Option::is_none")]
226 pub limit: Option<u64>,
227
228 #[serde(skip_serializing_if = "Option::is_none")]
230 pub product: Option<IdOrCreate<'a, CreateProduct<'a>>>,
231
232 #[serde(skip_serializing_if = "Option::is_none")]
237 pub starting_after: Option<PlanId>,
238}
239
240impl<'a> ListPlans<'a> {
241 pub fn new() -> Self {
242 ListPlans {
243 active: Default::default(),
244 created: Default::default(),
245 ending_before: Default::default(),
246 expand: Default::default(),
247 limit: Default::default(),
248 product: Default::default(),
249 starting_after: Default::default(),
250 }
251 }
252}
253impl Paginable for ListPlans<'_> {
254 type O = Plan;
255 fn set_last(&mut self, item: Self::O) {
256 self.starting_after = Some(item.id());
257 }
258}
259#[derive(Clone, Debug, Serialize, Default)]
261pub struct UpdatePlan<'a> {
262 #[serde(skip_serializing_if = "Option::is_none")]
264 pub active: Option<bool>,
265
266 #[serde(skip_serializing_if = "Expand::is_empty")]
268 pub expand: &'a [&'a str],
269
270 #[serde(skip_serializing_if = "Option::is_none")]
276 pub metadata: Option<Metadata>,
277
278 #[serde(skip_serializing_if = "Option::is_none")]
280 pub nickname: Option<&'a str>,
281
282 #[serde(skip_serializing_if = "Option::is_none")]
286 pub product: Option<IdOrCreate<'a, CreateProduct<'a>>>,
287
288 #[serde(skip_serializing_if = "Option::is_none")]
290 pub trial_period_days: Option<u32>,
291}
292
293impl<'a> UpdatePlan<'a> {
294 pub fn new() -> Self {
295 UpdatePlan {
296 active: Default::default(),
297 expand: Default::default(),
298 metadata: Default::default(),
299 nickname: Default::default(),
300 product: Default::default(),
301 trial_period_days: Default::default(),
302 }
303 }
304}
305
306#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
308#[serde(rename_all = "snake_case")]
309pub enum PlanAggregateUsage {
310 LastDuringPeriod,
311 LastEver,
312 Max,
313 Sum,
314}
315
316impl PlanAggregateUsage {
317 pub fn as_str(self) -> &'static str {
318 match self {
319 PlanAggregateUsage::LastDuringPeriod => "last_during_period",
320 PlanAggregateUsage::LastEver => "last_ever",
321 PlanAggregateUsage::Max => "max",
322 PlanAggregateUsage::Sum => "sum",
323 }
324 }
325}
326
327impl AsRef<str> for PlanAggregateUsage {
328 fn as_ref(&self) -> &str {
329 self.as_str()
330 }
331}
332
333impl std::fmt::Display for PlanAggregateUsage {
334 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
335 self.as_str().fmt(f)
336 }
337}
338impl std::default::Default for PlanAggregateUsage {
339 fn default() -> Self {
340 Self::LastDuringPeriod
341 }
342}
343
344#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
346#[serde(rename_all = "snake_case")]
347pub enum PlanBillingScheme {
348 PerUnit,
349 Tiered,
350}
351
352impl PlanBillingScheme {
353 pub fn as_str(self) -> &'static str {
354 match self {
355 PlanBillingScheme::PerUnit => "per_unit",
356 PlanBillingScheme::Tiered => "tiered",
357 }
358 }
359}
360
361impl AsRef<str> for PlanBillingScheme {
362 fn as_ref(&self) -> &str {
363 self.as_str()
364 }
365}
366
367impl std::fmt::Display for PlanBillingScheme {
368 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
369 self.as_str().fmt(f)
370 }
371}
372impl std::default::Default for PlanBillingScheme {
373 fn default() -> Self {
374 Self::PerUnit
375 }
376}
377
378#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
380#[serde(rename_all = "snake_case")]
381pub enum PlanInterval {
382 Day,
383 Month,
384 Week,
385 Year,
386}
387
388impl PlanInterval {
389 pub fn as_str(self) -> &'static str {
390 match self {
391 PlanInterval::Day => "day",
392 PlanInterval::Month => "month",
393 PlanInterval::Week => "week",
394 PlanInterval::Year => "year",
395 }
396 }
397}
398
399impl AsRef<str> for PlanInterval {
400 fn as_ref(&self) -> &str {
401 self.as_str()
402 }
403}
404
405impl std::fmt::Display for PlanInterval {
406 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
407 self.as_str().fmt(f)
408 }
409}
410impl std::default::Default for PlanInterval {
411 fn default() -> Self {
412 Self::Day
413 }
414}
415
416#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
418#[serde(rename_all = "snake_case")]
419pub enum PlanTiersMode {
420 Graduated,
421 Volume,
422}
423
424impl PlanTiersMode {
425 pub fn as_str(self) -> &'static str {
426 match self {
427 PlanTiersMode::Graduated => "graduated",
428 PlanTiersMode::Volume => "volume",
429 }
430 }
431}
432
433impl AsRef<str> for PlanTiersMode {
434 fn as_ref(&self) -> &str {
435 self.as_str()
436 }
437}
438
439impl std::fmt::Display for PlanTiersMode {
440 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
441 self.as_str().fmt(f)
442 }
443}
444impl std::default::Default for PlanTiersMode {
445 fn default() -> Self {
446 Self::Graduated
447 }
448}
449
450#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
452#[serde(rename_all = "snake_case")]
453pub enum PlanUsageType {
454 Licensed,
455 Metered,
456}
457
458impl PlanUsageType {
459 pub fn as_str(self) -> &'static str {
460 match self {
461 PlanUsageType::Licensed => "licensed",
462 PlanUsageType::Metered => "metered",
463 }
464 }
465}
466
467impl AsRef<str> for PlanUsageType {
468 fn as_ref(&self) -> &str {
469 self.as_str()
470 }
471}
472
473impl std::fmt::Display for PlanUsageType {
474 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
475 self.as_str().fmt(f)
476 }
477}
478impl std::default::Default for PlanUsageType {
479 fn default() -> Self {
480 Self::Licensed
481 }
482}
483
484#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
486#[serde(rename_all = "snake_case")]
487pub enum TransformUsageRound {
488 Down,
489 Up,
490}
491
492impl TransformUsageRound {
493 pub fn as_str(self) -> &'static str {
494 match self {
495 TransformUsageRound::Down => "down",
496 TransformUsageRound::Up => "up",
497 }
498 }
499}
500
501impl AsRef<str> for TransformUsageRound {
502 fn as_ref(&self) -> &str {
503 self.as_str()
504 }
505}
506
507impl std::fmt::Display for TransformUsageRound {
508 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
509 self.as_str().fmt(f)
510 }
511}
512impl std::default::Default for TransformUsageRound {
513 fn default() -> Self {
514 Self::Down
515 }
516}