1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use futures::future::Future; use reqwest::r#async::ClientBuilder; use reqwest::Url; use crate::request::*; use crate::session::*; pub struct Client { baseurl: String, client: reqwest::r#async::Client, } pub type Error = reqwest::Error; pub type StatusCode = reqwest::StatusCode; impl Client { pub fn new(baseurl: String) -> Result<Client, Error> { let client = ClientBuilder::new().build().unwrap(); Ok(Client { baseurl, client }) } fn create_url(&self, u: &str) -> Url { Url::parse(&self.baseurl).unwrap().join(u).unwrap() } pub fn request( &self, dr: &DisclosureRequest, ) -> impl Future<Item = SessionPackage, Error = Error> { self.client .post(self.create_url("/session")) .json(dr) .send() .and_then(|resp| resp.error_for_status()) .and_then(|mut resp| resp.json::<SessionPackage>()) } pub fn cancel(&self, token: &SessionToken) -> impl Future<Item = (), Error = Error> { self.client .delete(self.create_url("/session/").join(token.into()).unwrap()) .send() .and_then(|resp| resp.error_for_status()) .and_then(|resp| { resp.error_for_status()?; Ok(()) }) } pub fn result(&self, token: &SessionToken) -> impl Future<Item = SessionResult, Error = Error> { let token: &str = token.into(); self.client .get( self.create_url("/session/") .join(&format!("{}/result", token)) .unwrap(), ) .send() .and_then(|resp| resp.error_for_status()) .and_then(|mut resp| resp.json::<SessionResult>()) } }