digital_blasphemy_client 0.1.0

A client for the Digital Blasphemy API
Documentation
use crate::{
    model::common_response::Endpoints,
    model::wallpaper::Wallpaper,
    model::{Operator, Order},
};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Serialize, Deserialize, Debug)]
pub struct GetWallpapersResponse {
    pub db_core: GetWallpapersDBCore,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct GetWallpapersDBCore {
    pub timestamp: i64,
    pub endpoints: Endpoints,
    pub request: GetWallpapersDBCoreRequest,
    pub total_pages: u16,
    pub wallpapers: HashMap<String, Wallpaper>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct GetWallpapersDBCoreRequest {
    pub query: GetWallpapersResponseQuery,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GetWallpapersResponseQuery {
    pub filter_date_day: Option<u8>,
    pub filter_date_month: Option<u8>,
    pub filter_date_year: Option<u16>,
    pub filter_date_operator: Operator,
    pub filter_gallery: Option<Vec<u16>>,
    pub filter_rating: Option<f32>,
    pub filter_rating_operator: Option<Operator>,
    pub filter_res_operator_height: Option<Operator>,
    pub filter_res_operator_width: Option<Operator>,
    pub filter_res_height: i64,
    pub filter_res_operator: Operator,
    pub filter_res_width: i64,
    pub filter_tag: Option<Vec<u16>>,
    pub limit: u16,
    pub order: Order,
    pub order_by: GetWallpapersOrderBy,
    pub page: u16,
    pub s: Option<String>,
    pub show_comments: bool,
    pub show_pickle_jar: bool,
    pub show_resolutions: bool,
}

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum GetWallpapersOrderBy {
    Date,
    Name,
}

impl GetWallpapersOrderBy {
    pub(crate) fn as_str(&self) -> &'static str {
        match self {
            GetWallpapersOrderBy::Date => "date",
            GetWallpapersOrderBy::Name => "name",
        }
    }
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GetWallpapersRequest {
    pub filter_date_day: u8,
    pub filter_date_month: u8,
    pub filter_date_year: u16,
    pub filter_date_operator: Operator,
    pub filter_gallery: Vec<u16>,
    pub filter_rating: f32,
    pub filter_rating_operator: Operator,
    pub filter_res_height: i64,
    pub filter_res_operator: Operator,
    pub filter_res_operator_height: Operator,
    pub filter_res_operator_width: Operator,
    pub filter_res_width: i64,
    pub filter_tag: Vec<u16>,
    pub limit: u16,
    pub order: Order,
    pub order_by: GetWallpapersOrderBy,
    pub page: u16,
    pub s: String,
    pub show_comments: bool,
    pub show_pickle_jar: bool,
    pub show_resolutions: bool,
}

impl GetWallpapersRequest {
    pub fn builder() -> GetWallpapersRequestQueryBuilder {
        GetWallpapersRequestQueryBuilder::new()
    }
}

#[derive(Clone)]
pub struct GetWallpapersRequestQueryBuilder {
    get_wallpapers_request: GetWallpapersRequest,
}

#[allow(dead_code)]
impl GetWallpapersRequestQueryBuilder {
    pub(crate) fn new() -> Self {
        GetWallpapersRequestQueryBuilder {
            get_wallpapers_request: GetWallpapersRequest {
                filter_date_day: 0,
                filter_date_month: 0,
                filter_date_year: 0,
                filter_date_operator: Operator::GreaterThanOrEqual,
                filter_gallery: vec![],
                filter_rating: 0_f32,
                filter_rating_operator: Operator::GreaterThanOrEqual,
                filter_res_height: 0,
                filter_res_operator: Operator::GreaterThanOrEqual,
                filter_res_operator_height: Operator::GreaterThanOrEqual,
                filter_res_operator_width: Operator::GreaterThanOrEqual,
                filter_res_width: 0,
                filter_tag: vec![],
                limit: 10,
                order: Order::Ascending,
                order_by: GetWallpapersOrderBy::Date,
                page: 1,
                s: "".to_string(),
                show_comments: false,
                show_pickle_jar: false,
                show_resolutions: true,
            },
        }
    }

    pub fn build(self) -> GetWallpapersRequest {
        self.get_wallpapers_request
    }

    pub fn filter_date_day(mut self, filter_date_day: u8) -> GetWallpapersRequestQueryBuilder {
        if !(1..=31).contains(&filter_date_day) {
            panic!("Filter date day must be between 1 and 31.");
        }
        self.get_wallpapers_request.filter_date_day = filter_date_day;
        self
    }

    pub fn filter_date_month(mut self, filter_date_month: u8) -> GetWallpapersRequestQueryBuilder {
        if !(1..=12).contains(&filter_date_month) {
            panic!("Filter date month must be between 1 and 12.");
        }
        self.get_wallpapers_request.filter_date_month = filter_date_month;
        self
    }

    pub fn filter_date_year(mut self, filter_date_year: u16) -> GetWallpapersRequestQueryBuilder {
        if filter_date_year < 1997 {
            panic!("Filter date year must be from 1997 inclusive.");
        }
        self.get_wallpapers_request.filter_date_year = filter_date_year;
        self
    }

    pub fn filter_date_operator(
        mut self,
        filter_date_operator: Operator,
    ) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.filter_date_operator = filter_date_operator;
        self
    }

    pub fn filter_gallery(mut self, filter_gallery: Vec<u16>) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.filter_gallery = filter_gallery;
        self
    }

    pub fn filter_rating(mut self, filter_rating: f32) -> GetWallpapersRequestQueryBuilder {
        if !(1_f32..=5_f32).contains(&filter_rating) {
            panic!("Filter rating must be between 1 and 5.");
        }
        self.get_wallpapers_request.filter_rating = filter_rating;
        self
    }

    pub fn filter_rating_operator(
        mut self,
        filter_rating_operator: Operator,
    ) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.filter_rating_operator = filter_rating_operator;
        self
    }

    pub fn filter_res_height(mut self, filter_res_height: i64) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.filter_res_height = filter_res_height;
        self
    }

    pub fn filter_res_operator(
        mut self,
        filter_res_operator: Operator,
    ) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.filter_res_operator = filter_res_operator;
        self
    }

    pub fn filter_res_operator_height(
        mut self,
        filter_res_operator_height: Operator,
    ) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.filter_res_operator_height = filter_res_operator_height;
        self
    }

    pub fn filter_res_operator_width(
        mut self,
        filter_res_operator_width: Operator,
    ) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.filter_res_operator_width = filter_res_operator_width;
        self
    }

    pub fn filter_res_width(mut self, filter_res_width: i64) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.filter_res_width = filter_res_width;
        self
    }

    pub fn filter_tag(mut self, filter_tag: Vec<u16>) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.filter_tag = filter_tag;
        self
    }

    pub fn limit(mut self, limit: u16) -> GetWallpapersRequestQueryBuilder {
        if !(1..=50).contains(&limit) {
            panic!("Limit must be between 1 and 50.");
        }
        self.get_wallpapers_request.limit = limit;
        self
    }

    pub fn order(mut self, order: Order) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.order = order;
        self
    }

    pub fn order_by(mut self, order_by: GetWallpapersOrderBy) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.order_by = order_by;
        self
    }

    pub fn page(mut self, page: u16) -> GetWallpapersRequestQueryBuilder {
        if page < 1 {
            panic!("Page must be greater than 0.");
        }
        self.get_wallpapers_request.page = page;
        self
    }

    pub fn s(mut self, s: String) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.s = s;
        self
    }

    pub fn show_comments(mut self, show_comments: bool) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.show_comments = show_comments;
        self
    }

    pub fn show_pickle_jar(mut self, show_pickle_jar: bool) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.show_pickle_jar = show_pickle_jar;
        self
    }

    pub fn show_resolutions(mut self, show_resolutions: bool) -> GetWallpapersRequestQueryBuilder {
        self.get_wallpapers_request.show_resolutions = show_resolutions;
        self
    }
}