clientix_core/client/
response.rs

1use 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}