clientix_core/client/
response.rs1use std::net::SocketAddr;
2use reqwest::{StatusCode, Url, Version};
3use reqwest::header::HeaderMap;
4use thiserror::Error;
5
6pub type ClientixResult<T> = Result<T, ClientixError>;
7
8#[derive(Debug, Default)]
9pub struct ClientixErrorData {
10 message: Option<String>
11}
12
13pub struct ClientixErrorBuilder {
14 message: Option<String>
15}
16
17#[derive(Error, Debug)]
18pub enum ClientixError {
19 #[error("Network error")]
20 Http(ClientixErrorData, #[source] Option<Box<dyn std::error::Error + Send + Sync>>),
21
22 #[error("IO error")]
23 IO(ClientixErrorData, #[source] Option<Box<dyn std::error::Error + Send + Sync>>),
24
25 #[error("Invalid request")]
26 InvalidRequest(ClientixErrorData, #[source] Option<Box<dyn std::error::Error + Send + Sync>>),
27
28 #[error("invalid response")]
29 InvalidResponse(ClientixErrorData, #[source] Option<Box<dyn std::error::Error + Send + Sync>>),
30
31 #[error("Other error")]
32 Other(ClientixErrorData, #[source] Option<Box<dyn std::error::Error + Send + Sync>>),
33}
34
35#[derive(Debug)]
36pub struct ClientixResponse<T> {
37 version: Version,
38 content_length: Option<u64>,
39 status: StatusCode,
40 url: Url,
41 remote_addr: Option<SocketAddr>,
42 headers: HeaderMap,
43 body: T
44}
45
46impl From<reqwest::Error> for ClientixError {
47 fn from(err: reqwest::Error) -> ClientixError {
48 ClientixError::Http(ClientixErrorData::new(), Some(Box::new(err)))
49 }
50}
51
52impl From<serde_json::Error> for ClientixError {
53 fn from(err: serde_json::Error) -> ClientixError {
54 ClientixError::IO(ClientixErrorData::new(), Some(Box::new(err)))
55 }
56}
57
58impl From<serde_xml_rs::Error> for ClientixError {
59 fn from(err: serde_xml_rs::Error) -> ClientixError {
60 ClientixError::IO(ClientixErrorData::new(), Some(Box::new(err)))
61 }
62}
63
64impl From<serde_urlencoded::de::Error> for ClientixError {
65 fn from(err: serde_urlencoded::de::Error) -> ClientixError {
66 ClientixError::IO(ClientixErrorData::new(), Some(Box::new(err)))
67 }
68}
69
70impl ClientixErrorData {
71 pub fn new() -> ClientixErrorData {
72 ClientixErrorData {
73 message: None
74 }
75 }
76
77 pub fn message(&self) -> &Option<String> {
78 &self.message
79 }
80
81 pub fn builder() -> ClientixErrorBuilder {
82 ClientixErrorBuilder::new()
83 }
84
85}
86
87impl ClientixErrorBuilder {
88
89 fn new() -> Self {
90 ClientixErrorBuilder {
91 message: None
92 }
93 }
94
95 pub fn message(mut self, message: &str) -> Self {
96 self.message = Some(message.to_string());
97 self
98 }
99
100 pub fn build(self) -> ClientixErrorData {
101 ClientixErrorData {
102 message: self.message
103 }
104 }
105
106}
107
108impl <T> ClientixResponse<T> where T: Clone {
109
110 pub fn new(
111 version: Version,
112 content_length: Option<u64>,
113 status: StatusCode,
114 url: Url,
115 remote_addr: Option<SocketAddr>,
116 headers: HeaderMap,
117 body: T) -> ClientixResponse<T> {
118 ClientixResponse {
119 version,
120 content_length,
121 status,
122 url,
123 remote_addr,
124 headers,
125 body
126 }
127 }
128
129 pub fn version(&self) -> Version {
130 self.version
131 }
132
133 pub fn content_length(&self) -> Option<u64> {
134 self.content_length
135 }
136
137 pub fn status(&self) -> StatusCode {
138 self.status
139 }
140
141 pub fn url(&self) -> Url {
142 self.url.clone()
143 }
144
145 pub fn remote_addr(&self) -> Option<SocketAddr> {
146 self.remote_addr
147 }
148
149 pub fn headers(&self) -> &HeaderMap {
150 &self.headers
151 }
152
153 pub fn body(&self) -> T {
154 self.body.clone()
155 }
156
157}