#![warn(missing_docs)]
#[macro_use]
mod macros;
#[allow(dead_code)]
const BASE_URL: &str = "https://discord.com/api/v9";
#[cfg(feature = "types")]
pub mod types;
#[cfg(feature = "security")]
pub mod security;
#[cfg(any(feature = "handler", feature = "extended-handler"))]
#[cfg_attr(docsrs, doc(cfg(feature = "handler")))]
pub mod handler;
#[cfg(any(feature = "handler", feature = "extended-handler"))]
#[cfg_attr(docsrs, doc(cfg(feature = "handler")))]
pub use actix;
#[cfg(any(feature = "handler", feature = "extended-handler"))]
#[cfg_attr(docsrs, doc(cfg(feature = "handler")))]
pub use log;
#[cfg(any(feature = "handler", feature = "extended-handler"))]
#[cfg_attr(docsrs, doc(cfg(feature = "handler")))]
pub use attributes::*;
#[cfg(all(test, feature = "security"))]
mod tests;
pub trait Builder<T> {
type Error: std::error::Error;
fn build(self) -> Result<T, Self::Error>;
}
#[macro_export]
#[doc(hidden)]
macro_rules! expect_successful_api_response {
($response:ident, $succret:expr) => {
match $response {
Err(e) => {
debug!("Discord API request failed: {:#?}", e);
Err(HttpError {
code: 0,
message: format!("{:#?}", e),
})
}
Ok(r) => {
let st = r.status();
if !st.is_success() {
let e = format!("{:#?}", r.text().await);
debug!("Discord API returned an error: {:#?}", e);
Err(HttpError {
code: st.as_u16(),
message: e,
})
} else {
$succret
}
}
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! expect_specific_api_response {
($response:ident, $expres:expr, $succret:expr) => {
match $response {
Err(e) => {
debug!("Discord API request failed: {:#?}", e);
Err(HttpError {
code: 0,
message: format!("{:#?}", e),
})
}
Ok(r) => {
let st = r.status();
if st != $expres {
let e = format!("{:#?}", r.text().await);
debug!("Discord API returned an error: {:#?}", e);
Err(HttpError {
code: st.as_u16(),
message: e,
})
} else {
$succret
}
}
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! expect_successful_api_response_and_return {
($response:ident, $struc:ident, $retval:ident, $succret:expr) => {
match $response {
Err(e) => {
debug!("Discord API request failed: {:#?}", e);
Err(HttpError {
code: 0,
message: format!("{:#?}", e),
})
}
Ok(r) => {
let st = r.status();
let text = r.text().await.unwrap();
if !st.is_success() {
let e = format!("{:#?}", &text);
debug!("Discord API returned an error: {:#?}", e);
Err(HttpError {
code: st.as_u16(),
message: e,
})
} else {
let a: Result<$struc, serde_json::Error> = serde_json::from_str(&text);
match a {
Err(e) => {
debug!("Failed to decode response: {:#?}", e);
debug!("Original response: {:#?}", &text);
Err(HttpError {
code: 500,
message: format!("{:?}", e),
})
}
Ok($retval) => $succret,
}
}
}
}
};
}