csfdapi 0.1.0

Unofficial wrapper for mobile csfd api.
Documentation
use ::Csfd;
use reqwest;
use std::collections::HashMap;
use std::borrow::Cow;
use std::fmt;

pub struct HomeData {
    data: Vec<HomeDataItem>
}

impl HomeData {
    fn new() -> HomeData {
        HomeData {
            data: Vec::new()
        }
    }

    fn add_if_not_exists(&mut self, item: HomeDataItem) -> &mut Self {
        if !self.data.contains(&item) {
            self.data.push(item);
        }

        self
    }

    pub fn all(&mut self) -> &mut Self {
        self.new_videos()
            .tv_tips()
            .cinema_releases()
            .dvd_releases()
            .bluray_releases()
            .film_profile_visits()
            .creator_profile_visits()
            .adverts()
    }

    pub fn new_videos(&mut self) -> &mut Self {
        self.add_if_not_exists(HomeDataItem::NewVideos)
    }

    pub fn tv_tips(&mut self) -> & mut Self {
        self.add_if_not_exists(HomeDataItem::TvTips)
    }

    pub fn cinema_releases(&mut self) -> & mut Self {
        self.add_if_not_exists(HomeDataItem::CinemaReleases)
    }

    pub fn dvd_releases(&mut self) -> & mut Self {
        self.add_if_not_exists(HomeDataItem::DvdReleases)
    }

    pub fn bluray_releases(&mut self) -> & mut Self {
        self.add_if_not_exists(HomeDataItem::BlurayReleases)
    }

    pub fn film_profile_visits(&mut self) -> & mut Self {
        self.add_if_not_exists(HomeDataItem::FilmProfileVisits)
    }

    pub fn creator_profile_visits(&mut self) -> & mut Self {
        self.add_if_not_exists(HomeDataItem::CreatorProfileVisits)
    }

    pub fn adverts(&mut self) -> & mut Self {
        self.add_if_not_exists(HomeDataItem::Adverts)
    }
}

impl fmt::Display for HomeData {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let string = self.data.iter().map(|i| i.to_string()).collect::<Vec<String>>().join(",");
        write!(f, "{}", string)
    }
}

#[derive(PartialEq, Clone)]
pub enum HomeDataItem {
    NewVideos,
    TvTips,
    CinemaReleases,
    DvdReleases,
    BlurayReleases,
    FilmProfileVisits,
    CreatorProfileVisits,
    Adverts,
}

impl fmt::Display for HomeDataItem {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let string = match self {
            HomeDataItem::NewVideos => "new_videos",
            HomeDataItem::TvTips => "tv_tips",
            HomeDataItem::CinemaReleases => "cinema_releases",
            HomeDataItem::DvdReleases => "dvd_releases",
            HomeDataItem::BlurayReleases => "bluray_releases",
            HomeDataItem::FilmProfileVisits => "film_profile_visits",
            HomeDataItem::CreatorProfileVisits => "creator_profile_visits",
            HomeDataItem::Adverts => "adverts",
        };

        write!(f, "{}", string)
    }
}

#[derive(Debug)]
pub struct HomeRequest<'a> {
    inner: Csfd<'a>,
    params: HashMap<&'static str, Cow<'a, str>>,
}

impl<'a> HomeRequest<'a> {
    pub fn new(csfd: &Csfd<'a>) -> HomeRequest<'a> {
        HomeRequest {
            inner: csfd.clone(),
            params: HashMap::new(),
        }
    }

    pub fn data<F>(&mut self, data: F) -> &mut Self
        where F: FnOnce(&mut HomeData) -> &mut HomeData
    {
        let mut home_data = HomeData::new();
        data(&mut home_data);
        self.params.insert("data", home_data.to_string().into());
        self
    }

    pub fn limit(&mut self, limit: u32) -> &mut Self {
        self.params.insert("limit", limit.to_string().into());
        self
    }

    pub fn creator_profile_visits_limit(&mut self, limit: u32) -> &mut Self {
        self.params.insert("creator_profile_visits_limit", limit.to_string().into());
        self
    }

    pub fn send(&self) -> Result<String, reqwest::Error> {
        self.inner.get("home", Some(self.params.clone()))?.text()
    }
}