1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
use crate::error::SharedError;
use reqwest::Url;
use serde::{Serialize, Deserialize};

#[derive(Debug, Clone)]
pub struct ResponseError {
  pub status: reqwest::StatusCode,
  pub content: String,
  pub error_list: Option<Vec<Error>>,
}

pub struct UrlBuilder {
  url: Result<Url, SharedError>,
}

impl UrlBuilder {
  pub fn parse(base: &str) -> Result<Self, SharedError> {
    Ok(Self {
      url: Ok(Url::parse(base)?),
    })
  }

  pub fn query<T: Serialize + ?Sized>(mut self, query: &T) -> Self {
    let mut err = None;
    if let Ok(ref mut url) = self.url {
      let mut pairs = url.query_pairs_mut();
      let serializer = serde_urlencoded::Serializer::new(&mut pairs);
      if let Err(e) = query.serialize(serializer) {
        err.replace(e.into());
      }
    }
    if let Some(err) = err {
      self.url = Err(err);
    }
    self
  }

  pub fn build(self) -> Result<Url, SharedError> {
    self.url
  }
}


#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)]
pub struct Error {
    /// The code that identifies the type of error condition.
    #[serde(rename = "code")]
    pub code: String,
    /// A human readable description of the error condition.
    #[serde(rename = "message")]
    pub message: String,
    /// Additional information, if available, to clarify the error condition.
    #[serde(rename = "details", skip_serializing_if = "Option::is_none")]
    pub details: Option<String>,
}

impl Error {
    /// Error response returned when the request is unsuccessful.
    pub fn new(code: String, message: String) -> Error {
        Error {
            code,
            message,
            details: None,
        }
    }
}

#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)]
pub struct ErrorList {
    /// A list of error responses returned when the request is unsuccessful.
    pub errors: Vec<Error>,
}