1use std::marker::PhantomData;
2
3use restson::{blocking::RestClient, Error, Response, RestPath};
4use serde::{de, Deserialize, Serialize};
5#[derive(Serialize, Deserialize, Debug)]
8pub struct Pagination<T> {
9 pub prev: Option<Box<PageLink<T>>>,
10 pub next: Option<Box<PageLink<T>>>,
11}
12
13#[derive(Serialize, Debug)]
14pub struct PageLink<T> {
15 base_url: String,
16 params: String,
17 phantom: PhantomData<T>,
18}
19
20impl<T> PageLink<T> {
21 pub fn base_url(&self) -> &str {
22 &self.base_url
23 }
24
25 pub fn params(&self) -> &str {
26 &self.params
27 }
28}
29
30impl<T> Clone for PageLink<T> {
31 fn clone(&self) -> Self {
32 Self {
33 base_url: self.base_url.clone(),
34 params: self.params.clone(),
35 phantom: PhantomData,
36 }
37 }
38}
39
40impl<'a, T: 'a + RestPath<&'a PageLink<T>> + for<'de> serde::Deserialize<'de>> PageLink<T> {
41 pub fn get_blocking(&'a self, client: &mut RestClient) -> Result<Response<T>, Error> {
42 client.get(self)
43 }
44
45 pub async fn get(&'a self, client: &mut restson::RestClient) -> Result<Response<T>, Error> {
46 client.get(self).await
47 }
48}
49
50impl<'de, T> Deserialize<'de> for PageLink<T> {
51 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
52 where
53 D: serde::Deserializer<'de>,
54 {
55 let mut params: String = Deserialize::deserialize(deserializer)?;
56
57 let index_maybe = params.find("?");
58
59 let base_url: String = if let Some(index) = index_maybe {
60 params.drain(..(index + 1)).collect()
61 } else {
62 return Err(de::Error::custom(
63 "Failed to get index of parameters in URL for PageLink",
64 ));
65 };
66
67 Ok(PageLink {
68 base_url,
69 params,
70 phantom: PhantomData,
71 })
72 }
73}
74
75#[derive(Serialize, Debug)]
76pub struct RelationLink {
77 pub link: String,
78}
79
80impl<'de> Deserialize<'de> for RelationLink {
81 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
82 where
83 D: serde::Deserializer<'de>,
84 {
85 let link = Deserialize::deserialize(deserializer)?;
86
87 Ok(RelationLink { link })
88 }
89}
90
91#[derive(Serialize, Deserialize, Debug, Clone)]
92pub struct RelationshipsLink {
93 pub related: String,
94}
95
96#[derive(Serialize, Deserialize, Debug, Clone)]
97pub struct TransactionsLinks {
98 pub links: Option<RelationshipsLink>,
99}
100
101#[derive(Serialize, Deserialize, Debug, Clone)]
102pub struct MoneyObject {
103 #[serde(alias = "currencyCode")]
104 currency_code: String,
105 value: String,
106 #[serde(alias = "valueInBaseUnits")]
107 value_in_base_units: i64,
108}
109
110#[derive(Serialize, Deserialize, Debug, Clone)]
111pub struct CashbackObject {
112 pub description: String,
113 pub amount: MoneyObject,
114}
115
116#[derive(Serialize, Deserialize, Debug, Clone)]
117pub struct RoundUp {
118 pub amount: MoneyObject,
119 pub boost_portion: Option<MoneyObject>,
120}
121
122#[derive(Serialize, Debug, Clone)]
123pub struct TimeObject {
124 pub time: String,
125}
126
127impl<'de> Deserialize<'de> for TimeObject {
128 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
129 where
130 D: serde::Deserializer<'de>,
131 {
132 let string = Deserialize::deserialize(deserializer)?;
133
134 Ok(TimeObject { time: string })
135 }
136}