1use std::error;
8use std::fmt;
9
10#[derive(Debug, Clone)]
11pub struct ResponseContent<T> {
12 pub status: reqwest::StatusCode,
13 pub content: String,
14 pub entity: Option<T>,
15}
16
17#[derive(Debug)]
18pub enum Error<T> {
19 Reqwest(reqwest::Error),
20 Serde(serde_json::Error),
21 Io(std::io::Error),
22 ResponseError(ResponseContent<T>),
23}
24
25impl<T> fmt::Display for Error<T> {
26 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27 let (module, e) = match self {
28 Error::Reqwest(e) => ("reqwest", e.to_string()),
29 Error::Serde(e) => ("serde", e.to_string()),
30 Error::Io(e) => ("IO", e.to_string()),
31 Error::ResponseError(e) => (
32 "response",
33 format!("status code: {}, content: {}", e.status, e.content),
34 ),
35 };
36 write!(f, "error in {}: {}", module, e)
37 }
38}
39
40impl<T: fmt::Debug> error::Error for Error<T> {
41 fn source(&self) -> Option<&(dyn error::Error + 'static)> {
42 Some(match self {
43 Error::Reqwest(e) => e,
44 Error::Serde(e) => e,
45 Error::Io(e) => e,
46 Error::ResponseError(_) => return None,
47 })
48 }
49}
50
51impl<T> From<reqwest::Error> for Error<T> {
52 fn from(e: reqwest::Error) -> Self {
53 Error::Reqwest(e)
54 }
55}
56
57impl<T> From<serde_json::Error> for Error<T> {
58 fn from(e: serde_json::Error) -> Self {
59 Error::Serde(e)
60 }
61}
62
63impl<T> From<std::io::Error> for Error<T> {
64 fn from(e: std::io::Error) -> Self {
65 Error::Io(e)
66 }
67}
68
69pub fn urlencode<T: AsRef<str>>(s: T) -> String {
70 ::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect()
71}
72
73pub fn parse_deep_object(prefix: &str, value: &serde_json::Value) -> Vec<(String, String)> {
74 if let serde_json::Value::Object(object) = value {
75 let mut params = vec![];
76
77 for (key, value) in object {
78 match value {
79 serde_json::Value::Object(_) => params.append(&mut parse_deep_object(
80 &format!("{}[{}]", prefix, key),
81 value,
82 )),
83 serde_json::Value::Array(array) => {
84 for (i, value) in array.iter().enumerate() {
85 params.append(&mut parse_deep_object(
86 &format!("{}[{}][{}]", prefix, key, i),
87 value,
88 ));
89 }
90 }
91 serde_json::Value::String(s) => {
92 params.push((format!("{}[{}]", prefix, key), s.clone()))
93 }
94 _ => params.push((format!("{}[{}]", prefix, key), value.to_string())),
95 }
96 }
97
98 return params;
99 }
100
101 unimplemented!("Only objects are supported with style=deepObject")
102}
103
104pub mod accounts_api;
105pub mod achievements_api;
106pub mod badges_api;
107pub mod characters_api;
108pub mod effects_api;
109pub mod events_api;
110pub mod grand_exchange_api;
111pub mod items_api;
112pub mod leaderboard_api;
113pub mod maps_api;
114pub mod monsters_api;
115pub mod my_account_api;
116pub mod my_characters_api;
117pub mod npcs_api;
118pub mod resources_api;
119pub mod server_details_api;
120pub mod tasks_api;
121pub mod token_api;
122
123pub mod configuration;