From d9887360a2b015405abe550858391034e9dda9a1 Mon Sep 17 00:00:00 2001 From: David Blajda Date: Mon, 17 Dec 2018 05:35:19 +0000 Subject: Figuring out how to implement auth and ratelimt barriers --- src/helix/mod.rs | 83 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 10 deletions(-) (limited to 'src/helix/mod.rs') diff --git a/src/helix/mod.rs b/src/helix/mod.rs index 650c4b0..0ddd910 100644 --- a/src/helix/mod.rs +++ b/src/helix/mod.rs @@ -33,6 +33,18 @@ impl Namespace { } } +#[derive(PartialEq, Hash, Eq, Clone)] +pub enum Scope { + AnalyticsReadExtensions, + AnalyticsReadGames, + BitsRead, + ClipsEdit, + UserEdit, + UserEditBroadcast, + UserReadBroadcast, + UserReadEmail, +} + #[derive(Clone)] pub struct Client { inner: Arc, @@ -161,15 +173,66 @@ impl AuthClientBuilder { } } +use std::collections::BTreeMap; -#[derive(PartialEq, Hash, Eq, Clone)] -pub enum Scope { - AnalyticsReadExtensions, - AnalyticsReadGames, - BitsRead, - ClipsEdit, - UserEdit, - UserEditBroadcast, - UserReadBroadcast, - UserReadEmail, +enum RequestState { + Uninitalized, + Polling(Box + Send>) +} + +pub struct ApiRequest { + url: String, + params: BTreeMap, + client: Client, + state: RequestState, +} + +impl ApiRequest { + + pub fn new(url: String, + params: BTreeMap, + client: Client + ) -> ApiRequest + { + ApiRequest { + url, + params, + client: client, + state: RequestState::Uninitalized + } + } +} + +use futures::Poll; +use serde::de::DeserializeOwned; +use futures::Async; +use futures::try_ready; + +impl Future for ApiRequest { + type Item = T; + type Error = reqwest::Error; + + fn poll(&mut self) -> Poll { + loop { + match &mut self.state { + RequestState::Uninitalized => { + let request = self.client.client().get(&self.url); + let request = self.client.apply_standard_headers(request); + let request = request.query(&self.params); + + let f = request + .send() + .map(|mut res| { + res.json::() + }) + .and_then(|json| json); + self.state = RequestState::Polling(Box::new(f)); + }, + RequestState::Polling(future) => { + let res = try_ready!(future.poll()); + return Ok(Async::Ready(res)); + } + } + } + } } -- cgit v1.2.3