use super::{id::MediaIDLike, media_ops::MediaOps};
use ferrex_model::media::{
EpisodeReference, Media, MovieReference, SeasonReference, Series,
};
use ferrex_model::media_id::MediaID;
use ferrex_model::media_type::VideoMediaType;
pub trait MediaLike {
type MovieRef: MediaOps;
type SeriesRef: MediaOps;
type SeasonRef: MediaOps;
type EpisodeRef: MediaOps;
type MediaID: MediaIDLike;
fn to_movie(self) -> Option<Self::MovieRef>;
fn to_series(self) -> Option<Self::SeriesRef>;
fn to_season(self) -> Option<Self::SeasonRef>;
fn to_episode(self) -> Option<Self::EpisodeRef>;
fn as_movie(&self) -> Option<&Self::MovieRef>;
fn as_series(&self) -> Option<&Self::SeriesRef>;
fn as_season(&self) -> Option<&Self::SeasonRef>;
fn as_episode(&self) -> Option<&Self::EpisodeRef>;
fn media_type(&self) -> VideoMediaType;
}
impl MediaLike for Media {
type MovieRef = Box<MovieReference>;
type SeriesRef = Box<Series>;
type SeasonRef = Box<SeasonReference>;
type EpisodeRef = Box<EpisodeReference>;
type MediaID = MediaID;
fn to_movie(self) -> Option<Box<MovieReference>> {
match self {
Self::Movie(m) => Some(m),
_ => None,
}
}
fn to_series(self) -> Option<Box<Series>> {
match self {
Self::Series(s) => Some(s),
_ => None,
}
}
fn to_season(self) -> Option<Box<SeasonReference>> {
match self {
Self::Season(s) => Some(s),
_ => None,
}
}
fn to_episode(self) -> Option<Box<EpisodeReference>> {
match self {
Self::Episode(e) => Some(e),
_ => None,
}
}
fn as_movie(&self) -> Option<&Box<MovieReference>> {
match self {
Self::Movie(m) => Some(m),
_ => None,
}
}
fn as_series(&self) -> Option<&Box<Series>> {
match self {
Self::Series(s) => Some(s),
_ => None,
}
}
fn as_season(&self) -> Option<&Box<SeasonReference>> {
match self {
Self::Season(s) => Some(s),
_ => None,
}
}
fn as_episode(&self) -> Option<&Box<EpisodeReference>> {
match self {
Self::Episode(e) => Some(e),
_ => None,
}
}
fn media_type(&self) -> VideoMediaType {
match self {
Self::Movie(_) => VideoMediaType::Movie,
Self::Series(_) => VideoMediaType::Series,
Self::Season(_) => VideoMediaType::Season,
Self::Episode(_) => VideoMediaType::Episode,
}
}
}
#[cfg(feature = "rkyv")]
mod archived {
use super::*;
use ferrex_model::media::{
ArchivedEpisodeReference, ArchivedMedia, ArchivedMovieReference,
ArchivedSeasonReference, ArchivedSeries,
};
use ferrex_model::media_id::ArchivedMediaID;
use rkyv::boxed::ArchivedBox;
impl MediaLike for ArchivedMedia {
type MovieRef = ArchivedBox<ArchivedMovieReference>;
type SeriesRef = ArchivedBox<ArchivedSeries>;
type SeasonRef = ArchivedBox<ArchivedSeasonReference>;
type EpisodeRef = ArchivedBox<ArchivedEpisodeReference>;
type MediaID = ArchivedMediaID;
fn to_movie(self) -> Option<ArchivedBox<ArchivedMovieReference>> {
match self {
ArchivedMedia::Movie(m) => Some(m),
_ => None,
}
}
fn to_series(self) -> Option<ArchivedBox<ArchivedSeries>> {
match self {
ArchivedMedia::Series(s) => Some(s),
_ => None,
}
}
fn to_season(self) -> Option<ArchivedBox<ArchivedSeasonReference>> {
match self {
ArchivedMedia::Season(s) => Some(s),
_ => None,
}
}
fn to_episode(self) -> Option<ArchivedBox<ArchivedEpisodeReference>> {
match self {
ArchivedMedia::Episode(e) => Some(e),
_ => None,
}
}
fn as_movie(&self) -> Option<&ArchivedBox<ArchivedMovieReference>> {
match self {
ArchivedMedia::Movie(m) => Some(m),
_ => None,
}
}
fn as_series(&self) -> Option<&ArchivedBox<ArchivedSeries>> {
match self {
ArchivedMedia::Series(s) => Some(s),
_ => None,
}
}
fn as_season(&self) -> Option<&ArchivedBox<ArchivedSeasonReference>> {
match self {
ArchivedMedia::Season(s) => Some(s),
_ => None,
}
}
fn as_episode(&self) -> Option<&ArchivedBox<ArchivedEpisodeReference>> {
match self {
ArchivedMedia::Episode(e) => Some(e),
_ => None,
}
}
fn media_type(&self) -> VideoMediaType {
match self {
ArchivedMedia::Movie(_) => VideoMediaType::Movie,
ArchivedMedia::Series(_) => VideoMediaType::Series,
ArchivedMedia::Season(_) => VideoMediaType::Season,
ArchivedMedia::Episode(_) => VideoMediaType::Episode,
}
}
}
}