simkl 0.1.0

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

use serde::Deserialize;

/// Anime genre values used by the Simkl API (e.g. as the `&genre=` query parameter).
#[derive(Debug, Clone, Copy, PartialEq)]
#[repr(u8)]
pub enum AnimeGenre {
    Action,
    Adventure,
    Cars,
    Comedy,
    Dementia,
    Demons,
    Drama,
    Ecchi,
    Fantasy,
    Game,
    Harem,
    Historical,
    Horror,
    Josei,
    Kids,
    Magic,
    MartialArts,
    Mecha,
    Military,
    Music,
    Mystery,
    Parody,
    Police,
    Psychological,
    Romance,
    Samurai,
    School,
    SciFi,
    Seinen,
    Shoujo,
    ShoujoAi,
    Shounen,
    ShounenAi,
    SliceOfLife,
    Space,
    Sports,
    SuperPower,
    Supernatural,
    Thriller,
    Vampire,
    Yaoi,
    Yuri,
}

impl AnimeGenre {
    /// Returns the kebab-case API value for the genre (e.g. `"sci-fi"`, `"slice-of-life"`).
    pub fn as_str(&self) -> &'static str {
        match self {
            AnimeGenre::Action => "action",
            AnimeGenre::Adventure => "adventure",
            AnimeGenre::Cars => "cars",
            AnimeGenre::Comedy => "comedy",
            AnimeGenre::Dementia => "dementia",
            AnimeGenre::Demons => "demons",
            AnimeGenre::Drama => "drama",
            AnimeGenre::Ecchi => "ecchi",
            AnimeGenre::Fantasy => "fantasy",
            AnimeGenre::Game => "game",
            AnimeGenre::Harem => "harem",
            AnimeGenre::Historical => "historical",
            AnimeGenre::Horror => "horror",
            AnimeGenre::Josei => "josei",
            AnimeGenre::Kids => "kids",
            AnimeGenre::Magic => "magic",
            AnimeGenre::MartialArts => "martial-arts",
            AnimeGenre::Mecha => "mecha",
            AnimeGenre::Military => "military",
            AnimeGenre::Music => "music",
            AnimeGenre::Mystery => "mystery",
            AnimeGenre::Parody => "parody",
            AnimeGenre::Police => "police",
            AnimeGenre::Psychological => "psychological",
            AnimeGenre::Romance => "romance",
            AnimeGenre::Samurai => "samurai",
            AnimeGenre::School => "school",
            AnimeGenre::SciFi => "sci-fi",
            AnimeGenre::Seinen => "seinen",
            AnimeGenre::Shoujo => "shoujo",
            AnimeGenre::ShoujoAi => "shoujo-ai",
            AnimeGenre::Shounen => "shounen",
            AnimeGenre::ShounenAi => "shounen-ai",
            AnimeGenre::SliceOfLife => "slice-of-life",
            AnimeGenre::Space => "space",
            AnimeGenre::Sports => "sports",
            AnimeGenre::SuperPower => "super-power",
            AnimeGenre::Supernatural => "supernatural",
            AnimeGenre::Thriller => "thriller",
            AnimeGenre::Vampire => "vampire",
            AnimeGenre::Yaoi => "yaoi",
            AnimeGenre::Yuri => "yuri",
        }
    }
}

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

#[derive(Debug, Copy, Clone, PartialEq, Deserialize)]
#[repr(u8)]
pub enum AnimeType {
    #[serde(rename(deserialize = "tv"))]
    Tv,
    #[serde(rename(deserialize = "special"))]
    Special,
    #[serde(rename(deserialize = "ova"))]
    Ova,
    #[serde(rename(deserialize = "movie"))]
    Movie,
    // will be "music video"
    #[serde(rename(deserialize = "music video"))]
    MusicVideo,
    #[serde(rename(deserialize = "ona"))]
    Ona,
}

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

    #[test]
    fn test_anime_genre_as_str_single_word() {
        assert_eq!(AnimeGenre::Action.as_str(), "action");
        assert_eq!(AnimeGenre::Horror.as_str(), "horror");
        assert_eq!(AnimeGenre::Yuri.as_str(), "yuri");
    }

    #[test]
    fn test_anime_genre_as_str_hyphenated() {
        assert_eq!(AnimeGenre::MartialArts.as_str(), "martial-arts");
        assert_eq!(AnimeGenre::SciFi.as_str(), "sci-fi");
        assert_eq!(AnimeGenre::ShoujoAi.as_str(), "shoujo-ai");
        assert_eq!(AnimeGenre::ShounenAi.as_str(), "shounen-ai");
        assert_eq!(AnimeGenre::SliceOfLife.as_str(), "slice-of-life");
        assert_eq!(AnimeGenre::SuperPower.as_str(), "super-power");
    }

    #[test]
    fn test_anime_genre_display() {
        assert_eq!(AnimeGenre::SliceOfLife.to_string(), "slice-of-life");
        assert_eq!(AnimeGenre::SciFi.to_string(), "sci-fi");
    }
}