simkl 0.1.0

Library to build queries for SIMKL and decoding JSON responses using Serde
Documentation
use crate::{MediaType, Rating, anime::AnimeType};
use chrono::{DateTime, NaiveDate, Utc};
use serde::Deserialize;

pub const CALENDAR_BASE_URL: &str = "https://data.simkl.in/calendar/";
pub const AIRING_NEXT_TV_URL: &str = "https://data.simkl.in/calendar/tv.json";
pub const AIRING_NEXT_ANIME_URL: &str = "https://data.simkl.in/calendar/anime.json";
pub const AIRING_NEXT_MOVIE_URL: &str = "https://data.simkl.in/calendar/movie_release.json";

#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
pub struct RatingsItem {
    pub simkl: Rating,
}

#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
pub struct IdsItem {
    pub simkl_id: u32,
    pub slug: String,
    pub tmdb: u32,
    pub imdb: Option<String>,
    pub mal: Option<u32>,
}

#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
pub struct EpisodeItem {
    pub season: Option<u16>,
    pub episode: u16,
    pub url: Option<String>,
}

#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
pub struct CalendarItem {
    pub title: String,
    pub poster: String,
    pub date: DateTime<Utc>,
    pub release_date: NaiveDate,
    pub rank: u32,
    pub ratings: RatingsItem,
    pub url: String,
    pub ids: IdsItem,
    pub episode: Option<EpisodeItem>,
    pub anime_type: Option<AnimeType>,
}

/// Get monthly items.
///
/// Parameters:
/// * year: 4 digits format (example: `2025`)
/// * month: from 1 to 12 where 1 is january
pub fn get_monthly_request(what: MediaType, year: u16, month: u8) -> String {
    let mut result = String::from(CALENDAR_BASE_URL);
    result.push_str(&year.to_string());
    result.push('/');
    result.push_str(&month.to_string());
    match what {
        MediaType::Show => result.push_str("/tv.json"),
        MediaType::Anime => result.push_str("/anime.json"),
        MediaType::Movie => result.push_str("/movie_release.json"),
        MediaType::Episode => {}
    }
    result
}