Skip to main content

up_bank_api/
general.rs

1use std::marker::PhantomData;
2
3use restson::{blocking::RestClient, Error, Response, RestPath};
4use serde::{de, Deserialize, Serialize};
5// use restson::{RestPath};
6
7#[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}