1pub mod error;
5pub mod private_client;
6pub mod public_client;
7
8use self::error::{Error, ErrorKind, ErrorMessage, StatusError};
9use chrono::{DateTime, TimeZone, Utc};
10use serde::{self, de};
11use serde::{Deserialize, Deserializer};
12
13pub(crate) const COINBASE_API_URL: &'static str = "https://api.pro.coinbase.com";
14pub(crate) const COINBASE_SANDBOX_API_URL: &'static str =
15 "https://api-public.sandbox.pro.coinbase.com";
16
17pub type Json = serde_json::Value;
19
20pub(crate) async fn deserialize_response<T>(response: reqwest::Response) -> Result<T, Error>
22where
23 T: serde::de::DeserializeOwned,
24{
25 let status = response.status();
26 if !status.is_success() {
27 let error_message = response.json::<ErrorMessage>().await?;
28 return Err(Error::new(ErrorKind::Status(StatusError::new(
29 status.as_u16(),
30 error_message.message,
31 ))));
32 }
33
34 Ok(response.json::<T>().await?)
35}
36
37pub(crate) fn deserialize_to_date<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
39where
40 D: Deserializer<'de>,
41{
42 let s = String::deserialize(deserializer)?;
43 Utc.datetime_from_str(&s, "%+")
44 .map_err(serde::de::Error::custom)
45}
46
47pub(crate) fn deserialize_option_to_date<'de, D>(
48 deserializer: D,
49) -> Result<Option<DateTime<Utc>>, D::Error>
50where
51 D: Deserializer<'de>,
52{
53 #[derive(Deserialize)]
54 struct Wrapper(#[serde(deserialize_with = "deserialize_to_date")] DateTime<Utc>);
55 let v = Option::deserialize(deserializer)?;
56 Ok(v.map(|Wrapper(a)| a))
57}
58
59pub(crate) fn configure_pagination(
60 before: Option<&str>,
61 after: Option<&str>,
62 limit: Option<u16>,
63) -> String {
64 match (before, after, limit) {
65 (None, None, None) => String::from(""),
66 (None, None, Some(l)) => format!("limit={}", l),
67 (None, Some(a), None) => format!("after={}", a),
68 (Some(b), None, None) => format!("before={}", b),
69 (None, Some(a), Some(l)) => format!("after={}&limit={}", a, l),
70 (Some(b), None, Some(l)) => format!("before={}&limit={}", b, l),
71 (Some(b), Some(a), None) => format!("before={}&after={}", b, a),
72 (Some(b), Some(a), Some(l)) => format!("before={}&after={}&limit={}", b, a, l),
73 }
74}