libstripe/resources/billing/
plans.rs1use 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}