From 8615cc2f030240ba2982dba893fe63f11a0c8a88 Mon Sep 17 00:00:00 2001 From: David Blajda Date: Thu, 13 Dec 2018 20:56:55 +0000 Subject: Restructure project and included kraken endpoint --- src/helix/endpoints.rs | 121 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 src/helix/endpoints.rs (limited to 'src/helix/endpoints.rs') diff --git a/src/helix/endpoints.rs b/src/helix/endpoints.rs new file mode 100644 index 0000000..5c3aa05 --- /dev/null +++ b/src/helix/endpoints.rs @@ -0,0 +1,121 @@ +use futures::future::Future; +use reqwest::header; +use reqwest::r#async::{Chunk, Decoder, Request, Response}; +use reqwest::r#async::Client as ReqwestClient; + +use super::models::{DataContainer, PaginationContainer, User, Video, Clip}; + +const API_DOMAIN: &'static str = "api.twitch.tv"; + +/* When Client owns a ReqwestClient, any futures spawned do not immediately + * terminate but 'hang'. When creating a new client for each request this problem + * does not occur. This would need to be resolved so we can benefit from keep alive + * connections. + * + */ + +pub struct Client { + id: String, +} + +impl Client { + pub fn new(client_id: &str) -> Client { + Client { + id: client_id.to_owned(), + } + } + + fn create_client(&self) -> ReqwestClient { + let mut headers = header::HeaderMap::new(); + let auth_key = &self.id; + let header_value = header::HeaderValue::from_str(auth_key).unwrap(); + headers.insert("Client-ID", header_value); + + let client = ReqwestClient::builder().default_headers(headers).build().unwrap(); + client + } + + pub fn users( + &self, + id: Vec<&str>, + login: Vec<&str>, + ) -> impl Future, Error = reqwest::Error> { + let mut url = + String::from("https://") + &String::from(API_DOMAIN) + &String::from("/helix/users"); + + if id.len() > 0 || login.len() > 0 { + url.push_str("?"); + } + + if id.len() > 0 { + for index in 0..id.len() { + url.push_str("id="); + url.push_str(id[index]); + url.push('&'); + } + } + + if login.len() > 0 { + for index in 0..login.len() { + url.push_str("login="); + url.push_str(login[index]); + url.push('&'); + } + } + + + let f = self.create_client() + .get(&url) + .send() + .map(|mut res| res.json::>()) + .and_then(|json| json); + + return f; + } + + pub fn videos( + &self, + video_id: Option>, + user_id: Option<&str>, + game_id: Option<&str>, + ) -> impl Future, Error = reqwest::Error> { + let mut url = + String::from("https://") + &String::from(API_DOMAIN) + &String::from("/helix/videos"); + + url.push_str("?"); + if let Some(user_id) = user_id { + url.push_str("user_id="); + url.push_str(user_id); + url.push('&'); + } + + let f = self.create_client() + .get(&url) + .send() + .map(|mut res| { + res.json::>() + }) + .and_then(|json| json); + + return f; + } + + pub fn clip(&self, id: &str) + -> impl Future, Error=reqwest::Error> + { + let url = + String::from("https://") + + API_DOMAIN + "/helix/clips" + "?id=" + id; + + let f = self.create_client() + .get(&url) + .send() + .map(|mut res| { + println!("{:?}", res); + res.json::>() + }) + .and_then(|json| json); + + return f; + } +} -- cgit v1.2.3