use std::{collections::HashMap, ops::Deref};
use chrono::prelude::*;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use strum::IntoStaticStr;
#[derive(Debug, Deserialize, Clone, PartialEq, Eq, Hash)]
#[serde(transparent)]
pub struct Route(pub String);
impl Deref for Route {
type Target = str;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct UserListAnime {
pub user_id: String,
pub shows: HashMap<Route, ListAnime>,
pub custom_lists: Option<Vec<CustomList>>,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ListAnime {
pub route: String,
pub list_status: ListStatus,
pub episodes_seen: u64,
pub manual_score: Option<u8>,
pub average_auto_score: Option<u8>,
pub use_auto_scores: bool,
pub auto_scores: AutoScores,
pub start_date: DateTime<Utc>,
pub end_date: DateTime<Utc>,
pub note: Option<String>,
}
#[skip_serializing_none]
#[derive(Debug, Serialize, Clone, Default)]
#[serde(rename_all = "camelCase")]
pub struct ListAnimePut {
pub list_status: Option<ListStatus>,
pub episodes_seen: Option<u64>,
pub manual_score: Option<u8>,
pub use_auto_scores: Option<bool>,
pub auto_scores: Option<AutoScores>,
pub start_date: Option<DateTime<Utc>>,
pub end_date: Option<DateTime<Utc>>,
pub note: Option<String>,
pub action: Option<Action>,
}
#[non_exhaustive]
#[derive(Debug, Serialize, Copy, Clone)]
#[serde(rename_all = "camelCase")]
pub enum Action {
DeleteNode,
}
#[derive(Debug, Serialize, Deserialize, Copy, Clone, IntoStaticStr, PartialEq)]
#[serde(rename_all = "kebab-case")]
pub enum ListStatus {
Completed,
Watching,
OnHold,
Dropped,
ToWatch,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct AutoScores {
pub score_one: AutoScore,
pub score_two: AutoScore,
pub score_three: AutoScore,
pub score_four: AutoScore,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct AutoScore {
pub score_text: String,
pub score: u8,
}
#[derive(Debug, Deserialize, Clone)]
pub struct CustomList {
pub name: String,
pub route: String,
}