use super::core::Core;
use crate::libs::models::{MovieList, MovieDetails};
use crate::{client, opt_param, get};
#[derive(Clone)]
pub struct MovieSearch<'a> {
url: String,
handler: &'a Movies,
pub page: u64,
pub query: String,
pub region: Option<String>,
pub year: Option<String>,
pub primary_year: Option<String>,
pub language: Option<String>,
pub adult: bool,
}
impl<'a> MovieSearch<'a> {
#[syncwrap::wrap]
pub async fn exec(&self) -> Result<MovieList, reqwest::Error> {
let page = self.page.to_string();
let adult = self.adult.to_string();
let mut params = Vec::with_capacity(3);
params.push(("api_key", &self.handler.token));
params.push(("query", &self.query));
params.push(("page", &page));
params.push(("adult", &adult));
opt_param!(params, "region", self.region);
opt_param!(params, "year", self.year);
opt_param!(params, "primary_year", self.primary_year);
opt_param!(params, "language", self.language);
let req = self.handler.client.get(&self.url).query(¶ms);
get!(self.handler, req)?.json::<MovieList>().await
}
pub fn page(mut self, page: u64) -> Self {
self.page = page;
self
}
pub fn region(mut self, region: String) -> Self {
self.region = Some(region);
self
}
pub fn year(mut self, year: u64) -> Self {
self.year = Some(year.to_string());
self
}
pub fn primary_year(mut self, primary_year: u64) -> Self {
self.primary_year = Some(primary_year.to_string());
self
}
pub fn language(mut self, lang: String) -> Self {
self.language = Some(lang);
self
}
pub fn adult(mut self) -> Self {
self.adult = true;
self
}
}
#[derive(Clone)]
pub struct Movies {
host: String,
client: reqwest::Client,
token: String,
}
impl Movies{
pub fn new(host: &str, token: &str) -> Self {
let client = client!();
Movies {
host: host.to_owned(),
client,
token: token.to_owned(),
}
}
pub fn search<T: Into<String>>(&self, query: T) -> MovieSearch {
MovieSearch {
url: format!("{}/3/search/movie", &self.host),
handler: self,
page: 1,
query: query.into(),
region: None,
year: None,
primary_year: None,
language: None,
adult: false,
}
}
pub async fn details(&self, id: i64) -> Result<MovieDetails, reqwest::Error> {
let url = format!("{}/3/movie/{}", &self.host, id);
let req = self.client.get(&url)
.query(&[("api_key", &self.token)]);
get!(self, req)?.json::<MovieDetails>().await
}
}