libstripe/resources/billing/
plans.rs

1use crate::resources::common::currency::Currency;
2use crate::resources::common::object::Object;
3
4use crate::resources::common::path::UrlPath;
5use crate::resources::core::product::{ProductsParam, Products};
6use crate::util::{Deleted, Expandable, List, RangeQuery};
7use crate::Client;
8use std::collections::HashMap;
9
10#[derive(Serialize, Deserialize, Debug, PartialEq)]
11pub struct Plans {
12    pub id: String,
13    pub object: Object,
14    pub active: bool,
15    pub aggregate_usage: Option<AggregateUsage>,
16    pub amount: Option<i64>,
17    pub billing_scheme: Option<BillingScheme>,
18    pub created: i64,
19    pub currency: Currency,
20    pub interval: Interval,
21    pub interval_count: i64,
22    pub livemode: bool,
23    pub metadata: HashMap<String, String>,
24    pub nickname: Option<String>,
25    pub product: Option<Expandable<Products>>,
26    pub tiers: Option<Vec<Tiers>>,
27    pub tiers_mode: Option<TiersMode>,
28    pub transform_usage: Option<String>,
29    pub trial_period_days: Option<i64>,
30    pub usage_type: Option<UsageType>,
31}
32
33#[derive(Serialize, Deserialize, Debug, PartialEq)]
34#[serde(rename_all = "snake_case")]
35pub enum AggregateUsage {
36    Sum,
37    LastDuringPeriod,
38    LastEver,
39    Max,
40}
41
42#[derive(Serialize, Deserialize, Debug, PartialEq)]
43pub struct Tiers {
44    pub flat_amount: Option<i64>,
45    pub unit_amount: i64,
46    pub up_to: Option<i64>,
47}
48
49#[derive(Serialize, Deserialize, Debug, PartialEq)]
50#[serde(rename_all = "snake_case")]
51pub enum BillingScheme {
52    PerUnit,
53    Tiered,
54}
55
56#[derive(Serialize, Deserialize, Debug, PartialEq)]
57#[serde(rename_all = "lowercase")]
58pub enum TiersMode {
59    Graduated,
60    Volume,
61}
62
63#[derive(Serialize, Deserialize, Debug, PartialEq)]
64pub struct TransformUsage {
65    pub divide_by: f64,
66    pub round: Round,
67}
68
69#[derive(Serialize, Deserialize, Debug, PartialEq)]
70#[serde(rename_all = "lowercase")]
71pub enum Round {
72    UP,
73    DOWN,
74}
75
76#[derive(Serialize, Deserialize, Debug, PartialEq)]
77#[serde(rename_all = "lowercase")]
78pub enum UsageType {
79    Metered,
80    Licensed,
81}
82
83#[derive(Serialize, Deserialize, Debug, PartialEq)]
84#[serde(rename_all = "lowercase")]
85pub enum Interval {
86    Manual,
87    Day,
88    Week,
89    Month,
90    Year,
91}
92
93#[derive(Default, Debug, Serialize, PartialEq)]
94pub struct PlansParam<'a> {
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub id: Option<&'a str>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub amount: Option<i32>,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub currency: Option<Currency>,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub interval: Option<Interval>,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub nickname: Option<&'a str>,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub interval_count: Option<i32>,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub metadata: Option<HashMap<&'a str, &'a str>>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub product: Option<ProductsParam<'a>>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub expand: Option<Vec<&'a str>>,
113}
114
115
116#[derive(Default, Serialize, Debug, PartialEq)]
117pub struct PlansListParams<'a> {
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub active: Option<bool>,
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub created: Option<RangeQuery>,
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub product: Option<&'a str>,
124    #[serde(skip_serializing_if = "Option::is_none")]
125    pub ending_before: Option<&'a str>,
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub limit: Option<i64>,
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub starting_after: Option<&'a str>,
130    #[serde(skip_serializing_if = "Option::is_none")]
131    pub expand: Option<Vec<&'a str>>,
132}
133
134impl Plans {
135    pub fn create<B: serde::Serialize>(client: &Client, param: B) -> crate::Result<Self> {
136        client.post(UrlPath::Plans, vec![], param)
137    }
138
139    pub fn retrieve(client: &Client, plan: &str) -> crate::Result<Self> {
140        client.get(UrlPath::Plans, vec![plan], serde_json::Map::new())
141    }
142
143    pub fn update<B: serde::Serialize>(
144        client: &Client,
145        plan: &str,
146        param: B,
147    ) -> crate::Result<Self> {
148        client.post(UrlPath::Plans, vec![plan], param)
149    }
150
151    pub fn delete(client: &Client, plan: &str) -> crate::Result<Deleted> {
152        client.delete(UrlPath::Plans, vec![plan], serde_json::Map::new())
153    }
154
155    pub fn list<B: serde::Serialize>(client: &Client, param: B) -> crate::Result<List<Self>> {
156        client.get(UrlPath::Plans, vec![], param)
157    }
158}