firefly_iii_rust/
account.rs1use 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, #[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