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 +++++++++++++++++++++++++++++++++++++------ src/helix/namespaces/clips.rs | 20 +++++------ 2 files changed, 81 insertions(+), 22 deletions(-) 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)); + } + } + } + } } diff --git a/src/helix/namespaces/clips.rs b/src/helix/namespaces/clips.rs index 32793c0..351f006 100644 --- a/src/helix/namespaces/clips.rs +++ b/src/helix/namespaces/clips.rs @@ -1,4 +1,5 @@ use futures::future::Future; +use std::collections::BTreeMap; use super::super::models::{DataContainer, PaginationContainer, User, Video, Clip}; use super::super::Client; const API_DOMAIN: &'static str = "api.twitch.tv"; @@ -8,7 +9,7 @@ pub struct Clips {} type ClipsNamespace = Namespace; impl ClipsNamespace { - pub fn clip(self, id: &str) -> impl Future, Error=reqwest::Error> { + pub fn clip(self, id: &str) -> ApiRequest> { use self::clip; clip(self.client, id) } @@ -21,22 +22,17 @@ impl Client { } } +use super::super::ApiRequest; + + pub fn clip(client: Client, id: &str) - -> impl Future, Error=reqwest::Error> + -> ApiRequest> { let url = String::from("https://") + API_DOMAIN + "/helix/clips" + "?id=" + id; + let params = BTreeMap::new(); - let request = client.client().get(&url); - let request = client.apply_standard_headers(request); - - request - .send() - .map(|mut res| { - println!("{:?}", res); - res.json::>() - }) - .and_then(|json| json) + ApiRequest::new( url, params, client) } -- cgit v1.2.3