entertainarr-adapter-http 0.1.0

HTTP adapter for entertainarr
Documentation
use std::collections::HashSet;

use chrono::{DateTime, NaiveDate, Utc};

use crate::entity::language::Language;
use crate::entity::prelude::{AsStr, Page};
use crate::entity::tvshow_subscription::{TvShowSubscriptionDocument, TvShowSubscriptionEntity};
use crate::entity::{Entity, Relation};

crate::create_kind!(TvShowKind, "tvshows");

pub type TvShowEntity = Entity<u64, TvShowKind>;

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TvShowDocument {
    pub id: u64,
    #[serde(rename = "type")]
    pub kind: TvShowKind,
    pub attributes: TvShowAttributes,
    pub relationships: TvShowRelationships,
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TvShowAttributes {
    pub source: TvShowSource,
    pub original_name: String,
    pub original_language: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub origin_country: Vec<String>,
    pub language: Language,
    pub name: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub overview: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub tagline: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub poster_url: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub backdrop_url: Option<String>,
    pub homepage: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub first_air_date: Option<NaiveDate>,
    pub in_production: bool,
    pub adult: bool,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum TvShowInclude {
    #[default]
    Subscription,
}

impl AsStr for TvShowInclude {
    fn as_str(&self) -> &str {
        match self {
            Self::Subscription => "subscription",
        }
    }
}

impl std::str::FromStr for TvShowInclude {
    type Err = crate::entity::prelude::ParseEnumError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "subscription" => Ok(Self::Subscription),
            other => Err(crate::entity::prelude::ParseEnumError::new(other)),
        }
    }
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TvShowRelationships {
    pub subscription: Relation<TvShowSubscriptionEntity>,
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase", untagged)]
pub enum TvShowRelation {
    TvShowSubscription(TvShowSubscriptionDocument),
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub enum TvShowSource {
    Tmdb { tmdb_id: u64 },
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FindTvShowByIdParams {
    pub include: HashSet<TvShowInclude>,
}

impl FindTvShowByIdParams {
    pub fn include(mut self, item: TvShowInclude) -> Self {
        self.include.insert(item);
        self
    }
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ListTvShowParams {
    #[serde(default, skip_serializing_if = "HashSet::is_empty")]
    pub include: HashSet<TvShowInclude>,
    #[serde(default, skip_serializing_if = "Page::is_default")]
    pub page: Page,
}