1use crate::{client::Client};
2use ureq::{Error, Request};
3use serde::{Deserialize};
4
5#[derive(Deserialize)]
6pub struct Contact {
7 #[serde(rename = "ID")]
8 pub id: String,
9 #[serde(rename = "Name")]
10 pub name: String,
11 #[serde(rename = "Number")]
12 pub number: String,
13}
14
15#[derive(Default)]
16pub struct ContactDeleteParams {
17 pub id: u32,
18}
19
20#[derive(Default)]
21pub struct ContactsReadParams {
22 pub id: Option<u32>,
23}
24
25#[derive(Default)]
26pub struct ContactEditParams {
27 pub empfaenger: Option<String>,
28 pub id: u32,
29 pub nick: Option<String>,
30}
31
32#[derive(Debug, Deserialize)]
33pub struct ContactWriteResponse {
34 pub id: u64,
35 #[serde(rename = "return")]
36 pub return_: String,
37}
38
39#[derive(Debug, Deserialize)]
40pub struct ContactEditResponse {
41 #[serde(rename = "return")]
42 pub return_: String,
43}
44
45pub struct Contacts {
46 client: Client
47}
48
49impl Contacts {
50 pub fn new(client: Client) -> Self {
51 Contacts {
52 client,
53 }
54 }
55
56 pub fn request(&self, method: &str, action: &str) -> Request {
57 let req = self.client.request(method, "contacts").clone();
58
59 req.query("action", action)
60 }
61
62 pub fn read(&self, params: ContactsReadParams) -> Result<String, Error> {
63 Ok(self.request("GET", "read")
64 .query("id", &*params.id.unwrap_or_default().to_string())
65 .call()?.into_string()?)
66 }
67
68 pub fn read_json(&self, params: ContactsReadParams) -> Result<Vec<Contact>, Error> {
69 Ok(self.request("GET", "read")
70 .query("id", &*params.id.unwrap_or_default().to_string())
71 .query("json", "1")
72 .call()?.into_json::<Vec<Contact>>()?)
73 }
74
75 fn _write(&self, json: bool, _params: Option<ContactEditParams>) -> Request {
76 let mut req = self.request("GET", "write").clone();
77
78 if !_params.is_none() {
79 let params = _params.unwrap();
80
81 if params.nick.is_none() {
82 req = req.query("nick", &*params.nick.unwrap_or_default().to_string());
83 }
84
85 if params.empfaenger.is_none() {
86 req = req.query(
87 "empfaenger", &*params.empfaenger.unwrap_or_default().to_string());
88 }
89
90 req = req.query("id", &*params.id.to_string());
91 }
92
93 if json {
94 req = req.query("json", "1");
95 }
96
97 req
98 }
99
100 pub fn create(&self) -> Result<String, Error> {
101 Ok(self._write(false, None).call()?.into_string()?)
102 }
103
104 pub fn create_json(&self) -> Result<ContactWriteResponse, Error> {
105 Ok(self._write(true, None).call()?
106 .into_json::<ContactWriteResponse>()?)
107 }
108
109 pub fn edit(&self, params: ContactEditParams) -> Result<String, Error> {
110 Ok(self._write(false, Option::from(params))
111 .call()?.into_string()?)
112 }
113
114 pub fn edit_json(&self, params: ContactEditParams) -> Result<ContactEditResponse, Error> {
115 Ok(self._write(true, Option::from(params))
116 .call()?.into_json::<ContactEditResponse>()?)
117 }
118
119 pub fn delete(&self, params: ContactDeleteParams) -> Result<u8, Error> {
120 Ok(self.request("POST", "del")
121 .query("id", &*params.id.to_string()).call()?.into_json::<u8>()?)
122 }
123}