extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
extern crate percent_encoding;
extern crate reqwest;
use percent_encoding::{percent_encode, DEFAULT_ENCODE_SET};
pub mod builder;
pub mod api_request;
pub mod api_response;
pub mod enums;
use crate::builder::simple::ApiBuilderSimple;
use crate::builder::strict::ApiBuilderStrict;
use crate::api_request::ApiRequest;
use crate::api_response::{ApiResponse, ApiSessionNew, ApiSessionReset};
pub fn builder() -> ApiBuilderStrict {
strict_builder()
}
pub fn simple_builder() -> ApiBuilderSimple {
ApiBuilderSimple::new()
}
pub fn strict_builder() -> ApiBuilderStrict {
ApiBuilderStrict::new()
}
pub fn send(request: ApiRequest) -> Result<reqwest::Response, reqwest::Error> {
reqwest::Client::new()
.get(to_url(request).as_str())
.send()
}
pub fn send_and_parse(request: ApiRequest) -> Result<ApiResponse, reqwest::Error> {
let response: ApiResponse = send(request)
.expect("Failed to send Request")
.json()?;
Ok(response)
}
fn to_url(request: ApiRequest) -> String {
let mut url: String = request.base_url + "/api.php";
url.push_str("?amount=");
url.push_str(&request.questions.to_string());
url.push_str("&category=");
url.push_str(&request.category.to_string());
url.push_str("&difficulty=");
url.push_str(&request.difficulty);
url.push_str("&type=");
url.push_str(&request.question_type);
url.push_str("&encoding=");
url.push_str(&request.encoding);
if !request.token.is_empty() {
url.push_str("&token=");
url.push_str(&request.token);
}
percent_encode(url.as_bytes(), DEFAULT_ENCODE_SET).to_string()
}
pub fn session_new(base_url: Option<&str>) -> Result<ApiSessionNew, reqwest::Error> {
let rq: ApiSessionNew = reqwest::Client::new()
.get((base_url.unwrap_or("https://opentdb.com").to_string() + "/api_token.php?command=request").as_str())
.send()
.expect("Failed to send Request")
.json()?;
Ok(rq)
}
pub fn session_reset(token: &str, base_url: Option<&str>) -> Result<ApiSessionReset, reqwest::Error> {
let mut url: String = base_url.unwrap_or("https://opentdb.com").to_string() + "/api_token.php?command=reset&token=";
url.push_str(percent_encode(token.as_bytes(), DEFAULT_ENCODE_SET).to_string().as_str());
let rq: ApiSessionReset = reqwest::Client::new()
.get(url.as_str())
.send()
.expect("Failed to send Request")
.json()?;
Ok(rq)
}