use async_trait::async_trait;
use std::{borrow::Borrow, error};
#[async_trait]
pub trait SlackWebRequestSender {
type Error: error::Error;
async fn send<I, K, V, S>(&self, method: S, params: I) -> Result<String, Self::Error>
where
I: IntoIterator + Send,
K: AsRef<str>,
V: AsRef<str>,
I::Item: Borrow<(K, V)>,
S: AsRef<str> + Send;
}
#[cfg(feature = "reqwest")]
mod reqwest_support {
pub use self::reqwest::Error;
use async_trait::async_trait;
use reqwest_ as reqwest;
use std::borrow::Borrow;
use super::SlackWebRequestSender;
type Client = reqwest::Client;
#[async_trait]
impl SlackWebRequestSender for Client {
type Error = reqwest::Error;
async fn send<I, K, V, S>(&self, method_url: S, params: I) -> Result<String, Self::Error>
where
I: IntoIterator + Send,
K: AsRef<str>,
V: AsRef<str>,
I::Item: Borrow<(K, V)>,
S: AsRef<str> + Send,
{
let mut url = reqwest::Url::parse(method_url.as_ref()).expect("Unable to parse url");
url.query_pairs_mut().extend_pairs(params);
Ok(self.get(url).send().await?.text().await?)
}
}
pub fn default_client() -> Result<Client, reqwest::Error> {
Ok(Client::new())
}
}
#[cfg(feature = "reqwest")]
pub use self::reqwest_support::*;