firefly_iii_rust/
account.rs

1use serde::{Serialize,Deserialize};
2use std::borrow::Cow;
3use crate::http::Method;
4use crate::requests::Request;
5use crate::response::*;
6
7#[derive(Deserialize, Default, Debug, Clone)]
8pub struct Data {
9    pub attributes: Attributes,
10    pub id: String,
11    pub r#type: String,
12}
13
14#[derive(Deserialize, Default, Debug, Clone)]
15pub struct Attributes {
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub account_number: Option<String>,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub account_role: Option<String>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub active: Option<bool>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub bic: Option<String>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub created_at: Option<String>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub credit_card_type: Option<String>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub currency_code: Option<String>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub currency_decimal_places: Option<u32>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub currency_id: Option<String>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub currency_symbol: Option<String>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub current_balance: Option<String>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub current_balance_date: Option<String>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub current_debt: Option<String>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub iban: Option<String>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub include_net_worth: Option<bool>,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub interest: Option<String>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub interest_period: Option<String>,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub liability_direction: Option<String>,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub liability_type: Option<String>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub monthly_payment_date: Option<String>,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub name: Option<String>,
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub notes: Option<String>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub opening_balance: Option<String>,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub opening_balance_date: Option<String>,
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub order: Option<u64>,
66    pub r#type: String,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub updated_at: Option<String>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub virtual_balance: Option<String>,
71}
72
73#[derive(Serialize, Deserialize, Clone, Debug)]
74pub struct Get {
75    id: String,
76}
77
78impl Request for Get {
79    type Body = ();
80    type Response = Response<Data>;
81    const METHOD: Method = Method::Get;
82    fn endpoint(&self) -> Cow<str> {
83        format!("/v1/accounts/{}", self.id).into()
84    }
85}
86
87#[derive(Serialize, Deserialize, Default, Clone, Debug)]
88pub struct Create {
89    pub name: String,
90    pub r#type: String, // should be an enum
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub iban: Option<String>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub bic: Option<String>,
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub account_number: Option<String>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub opening_balance: Option<String>,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub opening_balance_date: Option<String>,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub virtual_balance: Option<String>,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub currency_id: Option<String>,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub currency_code: Option<String>,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub active: Option<bool>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub order: Option<u32>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub include_net_worth: Option<bool>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub account_role: Option<String>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub credit_card_type: Option<String>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub monthly_payment_date: Option<String>,
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub liability_type: Option<String>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub liability_direction: Option<String>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub interest: Option<String>,
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub interest_period: Option<String>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub notes: Option<String>,
129}
130
131impl Request for Create {
132    type Body = Create;
133    type Response = Response<Data>;
134    const METHOD: Method = Method::Post;
135    fn endpoint(&self) -> Cow<str> {
136        format!("/v1/accounts").into()
137    }
138    fn body(&self) -> Option<Self::Body> {
139        Some(self.clone())
140    }
141}
142
143#[derive(Serialize, Deserialize, Clone, Debug)]
144pub struct Delete {
145    pub id: String,
146}
147
148impl Request for Delete {
149    type Body = ();
150    type Response = EmptyResponse;
151    const METHOD: Method = Method::Delete;
152    fn endpoint(&self) -> Cow<str> {
153        format!("/v1/accounts/{}", self.id).into()
154    }
155}
156
157#[derive(Serialize, Deserialize, Clone, Debug)]
158pub struct List {
159    pub current_page: u64,
160    pub total_pages: u64,
161}
162
163impl Request for List {
164    type Body = ();
165    type Response = PaginatedResponse<Vec<Data>>;
166    const METHOD: Method = Method::Get;
167    fn endpoint(&self) -> Cow<str> {
168        let mut endpoint = "/v1/accounts".to_string();
169        endpoint.push_str("?");
170        endpoint.push_str(&format!("page={}", self.current_page));
171        endpoint.push_str("&");
172        endpoint.push_str("limit=50");
173        endpoint.into()
174    }
175}
176
177impl Paginated for List {
178    fn set_page(&mut self, page: u64) {
179        self.current_page = page;
180    }
181
182    fn get_page(&self) -> u64 {
183        self.current_page
184    }
185
186    fn max_page(&self) -> u64 {
187        self.total_pages
188    }
189}
190