diff --git a/Cargo.toml b/Cargo.toml index 54d448c34..2252b6866 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,13 +7,14 @@ license = "MIT/Apache-2.0" name = "slack-hook" readme = "README.md" repository = "https://github.com/frostly/rust-slack" -version = "0.8.0" +version = "0.9.0" [dependencies] chrono = "0.4" reqwest = "0.9" hex = "0.3" error-chain = "~0.11" +futures = "0.1.28" serde = "1" serde_derive = "1" serde_json = "1" diff --git a/src/lib.rs b/src/lib.rs index 52e764576..bfa257b90 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,7 @@ extern crate reqwest; extern crate chrono; #[macro_use] extern crate error_chain; +extern crate futures; extern crate hex as hexx; extern crate serde; #[macro_use] diff --git a/src/slack.rs b/src/slack.rs index 05b7ac17d..48b556691 100644 --- a/src/slack.rs +++ b/src/slack.rs @@ -1,6 +1,8 @@ use chrono::NaiveDateTime; use error::{Error, ErrorKind, Result}; -use reqwest::{Client, Url}; +use futures::*; +use reqwest::async::Client; +use reqwest::Url; use serde::{Serialize, Serializer}; use std::fmt; use {Payload, TryInto}; @@ -23,14 +25,35 @@ impl Slack { /// Send payload to slack service pub fn send(&self, payload: &Payload) -> Result<()> { - let response = self.client.post(self.hook.clone()).json(payload).send()?; - - if response.status().is_success(){ + let response = self + .client + .post(self.hook.clone()) + .json(payload) + .send() + .wait()?; + + if response.status().is_success() { Ok(()) } else { Err(ErrorKind::Slack(format!("HTTP error {}", response.status())).into()) } } + + /// Send payload to slack service, returning a future Response. + pub fn async_send(&self, payload: &Payload) -> impl Future { + self.client + .post(self.hook.clone()) + .json(payload) + .send() + .map_err(|err| err.into()) + .and_then(|response| { + if response.status().is_success() { + Ok(()) + } else { + Err(ErrorKind::Slack(format!("HTTP error {}", response.status())).into()) + } + }) + } } /// Slack timestamp