1use crate::client::Client;
2use ureq::{Error, Request};
3use serde::{Deserialize};
4
5#[derive(Deserialize)]
6pub struct JournalInbound {
7 pub from: String,
8 pub id: String,
9 pub price: String,
10 pub text: String,
11 pub timestamp: String,
12 pub to: String,
13}
14
15#[derive(Deserialize)]
16pub struct JournalOutbound {
17 pub connection: String,
18 pub dlr: Option<String>,
19 pub dlr_timestamp: Option<String>,
20 pub foreign_id: Option<String>,
21 pub from: String,
22 pub id: String,
23 pub label: Option<String>,
24 pub latency: Option<String>,
25 pub mccmnc: Option<String>,
26 pub price: String,
27 pub text: String,
28 pub timestamp: String,
29 pub to: String,
30 #[serde(rename = "type")]
31 pub type_: String,
32}
33
34#[derive(Default)]
35pub struct JournalParams {
36 pub date_from: Option<String>,
37 pub date_to: Option<String>,
38 pub id: Option<u64>,
39 pub state: Option<String>,
40 pub to: Option<String>,
41}
42
43#[derive(Deserialize)]
44pub struct JournalReplies {
45 pub from: String,
46 pub id: String,
47 pub price: String,
48 pub text: String,
49 pub timestamp: String,
50 pub to: String,
51}
52
53#[derive(Deserialize)]
54pub struct JournalVoice {
55 pub duration: String,
56 pub error: String,
57 pub from: String,
58 pub id: String,
59 pub price: String,
60 pub status: String,
61 pub text: String,
62 pub timestamp: String,
63 pub to: String,
64 pub xml: bool,
65}
66
67pub struct Journal {
68 client: Client
69}
70
71impl Journal {
72 pub fn new(client: Client) -> Self {
73 Journal {
74 client,
75 }
76 }
77
78 pub fn get(&self, params: JournalParams, type_: &str) -> Request {
79 let mut req = self.client.request("GET", "journal").clone();
80
81 if params.id.is_some() {
82 req = req.query("id", &*params.id.unwrap_or_default().to_string());
83 }
84 if params.date_from.is_some() {
85 req = req.query("date_from", &*params.date_from.unwrap_or_default());
86 }
87 if params.date_to.is_some() {
88 req = req.query("date_to", &*params.date_to.unwrap_or_default());
89 }
90 if params.to.is_some() {
91 req = req.query("to", &*params.to.unwrap_or_default());
92 }
93 if params.state.is_some() {
94 req = req.query("state", &*params.state.unwrap_or_default());
95 }
96
97 req.query("type", type_)
98 }
99
100 pub fn inbound(&self, params: JournalParams) -> Result<Vec<JournalInbound>, Error> {
101 Ok(self.get(params, "inbound").call()?.into_json::<Vec<JournalInbound>>()?)
102 }
103
104 pub fn outbound(&self, params: JournalParams) -> Result<Vec<JournalOutbound>, Error> {
105 Ok(self.get(params, "outbound").call()?.into_json::<Vec<JournalOutbound>>()?)
106 }
107
108 pub fn replies(&self, params: JournalParams) -> Result<Vec<JournalReplies>, Error> {
109 Ok(self.get(params, "replies").call()?.into_json::<Vec<JournalReplies>>()?)
110 }
111
112 pub fn voice(&self, params: JournalParams) -> Result<Vec<JournalVoice>, Error> {
113 Ok(self.get(params, "voice").call()?.into_json::<Vec<JournalVoice>>()?)
114 }
115}