use std::fmt::{self, Debug, Display, Formatter};
use serde::Deserialize;
use crate::{
client::Client,
error::ApiResult,
film::{Film, FilmId, FilmStatus},
};
#[derive(Deserialize, Debug, PartialEq, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct PackageFilm {
pub film_id: FilmId,
pub title: String,
pub split_percent: f32,
pub trailer_duration: u32,
pub clean_up_duration: u32,
pub order: u32,
}
impl PackageFilm {
pub async fn film(&self, client: &Client) -> ApiResult<Film> {
client.get_film(&self.film_id).await
}
}
#[derive(Deserialize, Debug, PartialEq, Eq, Clone, Copy, Hash)]
#[serde(transparent)]
pub struct FilmPackageId(u32);
impl FilmPackageId {
#[must_use]
pub const fn into_u32(self) -> u32 {
self.0
}
pub async fn fetch(self, client: &Client) -> ApiResult<FilmPackage> {
client.get_film_package(self).await
}
}
impl Display for FilmPackageId {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Deserialize, Debug, PartialEq, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct FilmPackage {
pub id: FilmPackageId,
pub title: String,
pub status: FilmStatus,
pub films: Vec<PackageFilm>,
}