libstripe/resources/billing/
coupons.rs1use crate::resources::common::object::Object;
2use crate::resources::common::currency::Currency;
3use std::collections::HashMap;
4use crate::util::{RangeQuery, Deleted, List};
5use crate::Client;
6use crate::resources::common::path::UrlPath;
7
8#[derive(Serialize, Deserialize, Debug, PartialEq)]
9pub struct Coupon {
10 pub id: String,
11 pub object: Object,
12 pub amount_off: Option<i64>,
13 pub created: i64,
14 pub currency: Option<Currency>,
15 pub duration: Duration,
16 pub duration_in_months: Option<i32>,
17 pub livemode: bool,
18 pub max_redemptions: Option<i64>,
19 pub metadata: HashMap<String, String>,
20 pub name: Option<String>,
21 pub percent_off: Option<f32>,
22 pub redeem_by: Option<i64>,
23 pub times_redeemed: i32,
24 pub valid: bool,
25}
26
27#[derive(Serialize, Deserialize, Debug, PartialEq)]
28#[serde(rename_all = "lowercase")]
29pub enum Duration {
30 Forever,
31 Once,
32 Repeating,
33}
34
35#[derive(Default, Serialize, Debug, PartialEq)]
36pub struct CouponParam<'a> {
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub id: Option<&'a str>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub duration: Option<Duration>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub amount_off: Option<i32>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub currency: Option<Currency>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub duration_in_months: Option<i32>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub max_redemptions: Option<i32>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub name: Option<&'a str>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub metadata: Option<HashMap<String, String>>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub percent_off: Option<i32>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub redeem_by: Option<i64>,
57}
58
59#[derive(Default, Serialize, Debug, PartialEq)]
60pub struct CouponListParam<'a> {
61 #[serde(skip_serializing_if = "Option::is_none")]
62 pub created: Option<RangeQuery>,
63 #[serde(skip_serializing_if = "Option::is_none")]
64 pub ending_before: Option<&'a str>,
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub limit: Option<i64>,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub starting_after: Option<&'a str>,
69}
70
71impl Coupon {
72 pub fn create<B: serde::Serialize>(client: &Client, param: B) -> crate::Result<Self> {
73 client.post(UrlPath::Coupons, vec![], param)
74 }
75
76 pub fn retrieve(client: &Client, coupon: &str) -> crate::Result<Self> {
77 client.get(UrlPath::Coupons, vec![coupon], serde_json::Map::new())
78 }
79
80 pub fn update<B: serde::Serialize>(
81 client: &Client,
82 coupon: &str,
83 param: B,
84 ) -> crate::Result<Self> {
85 client.post(UrlPath::Coupons, vec![coupon], param)
86 }
87
88 pub fn delete(client: &Client, coupon: &str) -> crate::Result<Deleted> {
89 client.delete(UrlPath::Coupons, vec![coupon], serde_json::Map::new())
90 }
91
92 pub fn list<B: serde::Serialize>(client: &Client, param: B) -> crate::Result<List<Self>> {
93 client.get(UrlPath::Coupons, vec![], param)
94 }
95}
96