neptunium_http/
endpoints.rs1use std::string::FromUtf8Error;
2
3use serde::de::DeserializeOwned;
4
5use crate::{
6 error::{ApiErrorResponse, ApiRateLimitedResponse},
7 request::Request,
8};
9
10pub mod channel;
11pub mod gateway;
12pub mod guild;
13pub mod invites;
14pub mod meta;
15#[cfg(feature = "user_api")]
16pub mod saved_media;
17pub mod webhooks;
18
19impl<T: DeserializeOwned> ResponseBody for T {
20 fn deserialize(bytes: Vec<u8>) -> Result<Self, Box<ExecuteEndpointRequestError>> {
21 if bytes.is_empty() {
22 let mut deserializer = serde_json::Deserializer::from_str("null");
23 Ok(serde_path_to_error::deserialize(&mut deserializer)?)
24 } else {
25 let s = String::from_utf8(bytes).map_err(ExecuteEndpointRequestError::NonUtf8Bytes)?;
26 let mut deserializer = serde_json::Deserializer::from_str(&s);
27 Ok(serde_path_to_error::deserialize(&mut deserializer)?)
28 }
29 }
30}
31
32pub trait ResponseBody: Sized {
33 fn deserialize(bytes: Vec<u8>) -> Result<Self, Box<ExecuteEndpointRequestError>>;
37}
38
39pub trait Endpoint: Clone + std::fmt::Debug {
41 type Response: ResponseBody;
42 fn into_request(self) -> Request;
43 }
61
62#[derive(Debug)]
63pub enum ExecuteEndpointRequestError {
64 NetworkError(reqwest::Error),
65 ResponseNotOk(reqwest::Response),
66 DeserializationError(serde_path_to_error::Error<serde_json::Error>),
67 NonUtf8Bytes(FromUtf8Error),
68 RateLimited(ApiRateLimitedResponse),
74 BadRequest(ApiErrorResponse),
76 Unauthorized(ApiErrorResponse),
78 Forbidden(ApiErrorResponse),
80 NotFound(ApiErrorResponse),
82 InternalServerError(ApiErrorResponse),
84}
85
86impl From<reqwest::Error> for ExecuteEndpointRequestError {
87 fn from(value: reqwest::Error) -> Self {
88 Self::NetworkError(value)
89 }
90}
91
92impl From<reqwest::Error> for Box<ExecuteEndpointRequestError> {
93 fn from(value: reqwest::Error) -> Self {
94 Box::new(ExecuteEndpointRequestError::NetworkError(value))
95 }
96}
97
98impl From<serde_path_to_error::Error<serde_json::Error>> for Box<ExecuteEndpointRequestError> {
99 fn from(value: serde_path_to_error::Error<serde_json::Error>) -> Self {
100 Box::new(ExecuteEndpointRequestError::DeserializationError(value))
101 }
102}
103
104impl From<serde_path_to_error::Error<serde_json::Error>> for ExecuteEndpointRequestError {
105 fn from(value: serde_path_to_error::Error<serde_json::Error>) -> Self {
106 Self::DeserializationError(value)
107 }
108}