simkl 0.1.0

Library to build queries for SIMKL and decoding JSON responses using Serde
Documentation
use std::fmt;

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ShowStatus {
    Returning,
    Continuing,
    Ended,
    Canceled,
    Hiatus,
}

impl fmt::Display for ShowStatus {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let s = match self {
            ShowStatus::Returning => "returning",
            ShowStatus::Continuing => "continuing",
            ShowStatus::Ended => "ended",
            ShowStatus::Canceled => "canceled",
            ShowStatus::Hiatus => "hiatus",
        };
        write!(f, "{}", s)
    }
}

/// TV show genre values used by the Simkl API (e.g. as the `&genre=` query parameter).
#[derive(Debug, Clone, Copy, PartialEq)]
#[repr(u8)]
pub enum TvGenre {
    Action,
    Adventure,
    Animation,
    AwardsShow,
    Children,
    Comedy,
    Crime,
    Documentary,
    Drama,
    Erotica,
    Family,
    Fantasy,
    Food,
    GameShow,
    History,
    HomeAndGarden,
    Horror,
    Indie,
    KoreanDrama,
    MartialArts,
    MiniSeries,
    Musical,
    Mystery,
    News,
    Podcast,
    Reality,
    Romance,
    ScienceFiction,
    Soap,
    SpecialInterest,
    Sport,
    Suspense,
    TalkShow,
    Thriller,
    Travel,
    War,
    Western,
}

impl TvGenre {
    /// Returns the kebab-case API value for the genre (e.g. `"awards-show"`, `"science-fiction"`).
    pub fn as_str(&self) -> &'static str {
        match self {
            TvGenre::Action => "action",
            TvGenre::Adventure => "adventure",
            TvGenre::Animation => "animation",
            TvGenre::AwardsShow => "awards-show",
            TvGenre::Children => "children",
            TvGenre::Comedy => "comedy",
            TvGenre::Crime => "crime",
            TvGenre::Documentary => "documentary",
            TvGenre::Drama => "drama",
            TvGenre::Erotica => "erotica",
            TvGenre::Family => "family",
            TvGenre::Fantasy => "fantasy",
            TvGenre::Food => "food",
            TvGenre::GameShow => "game-show",
            TvGenre::History => "history",
            TvGenre::HomeAndGarden => "home-and-garden",
            TvGenre::Horror => "horror",
            TvGenre::Indie => "indie",
            TvGenre::KoreanDrama => "korean-drama",
            TvGenre::MartialArts => "martial-arts",
            TvGenre::MiniSeries => "mini-series",
            TvGenre::Musical => "musical",
            TvGenre::Mystery => "mystery",
            TvGenre::News => "news",
            TvGenre::Podcast => "podcast",
            TvGenre::Reality => "reality",
            TvGenre::Romance => "romance",
            TvGenre::ScienceFiction => "science-fiction",
            TvGenre::Soap => "soap",
            TvGenre::SpecialInterest => "special-interest",
            TvGenre::Sport => "sport",
            TvGenre::Suspense => "suspense",
            TvGenre::TalkShow => "talk-show",
            TvGenre::Thriller => "thriller",
            TvGenre::Travel => "travel",
            TvGenre::War => "war",
            TvGenre::Western => "western",
        }
    }
}

impl fmt::Display for TvGenre {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.as_str())
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_tv_genre_as_str_single_word() {
        assert_eq!(TvGenre::Action.as_str(), "action");
        assert_eq!(TvGenre::Western.as_str(), "western");
        assert_eq!(TvGenre::Food.as_str(), "food");
    }

    #[test]
    fn test_tv_genre_as_str_hyphenated() {
        assert_eq!(TvGenre::AwardsShow.as_str(), "awards-show");
        assert_eq!(TvGenre::GameShow.as_str(), "game-show");
        assert_eq!(TvGenre::HomeAndGarden.as_str(), "home-and-garden");
        assert_eq!(TvGenre::KoreanDrama.as_str(), "korean-drama");
        assert_eq!(TvGenre::MartialArts.as_str(), "martial-arts");
        assert_eq!(TvGenre::MiniSeries.as_str(), "mini-series");
        assert_eq!(TvGenre::ScienceFiction.as_str(), "science-fiction");
        assert_eq!(TvGenre::SpecialInterest.as_str(), "special-interest");
        assert_eq!(TvGenre::TalkShow.as_str(), "talk-show");
    }

    #[test]
    fn test_tv_genre_display() {
        assert_eq!(TvGenre::TalkShow.to_string(), "talk-show");
        assert_eq!(TvGenre::ScienceFiction.to_string(), "science-fiction");
    }
}