AkurAI Build
Menu

BifrOSt-Apps

public

Latest change f67fd8437552caf5eb9371b0012e81d27c807ca3 - Add native RÚV television application by Ólafur Búi Ólafsson

use chrono::{DateTime, FixedOffset};
use std::error::Error;
use std::fmt;

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Article {
    pub title: String,
    pub url: String,
    pub author: Option<String>,
    pub published: Option<DateTime<FixedOffset>>,
    pub body: String,
    pub image_url: Option<String>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct VodShelf {
    pub title: String,
    pub slug: String,
    pub programs: Vec<ProgramCard>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProgramCard {
    pub program_id: i64,
    pub title: String,
    pub foreign_title: Option<String>,
    pub description: String,
    pub image_url: Option<String>,
    pub episode_id: Option<String>,
    pub episode_title: Option<String>,
    pub rating: Option<u8>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Program {
    pub program_id: i64,
    pub title: String,
    pub foreign_title: Option<String>,
    pub description: String,
    pub image_url: Option<String>,
    pub episodes: Vec<Episode>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Episode {
    pub id: String,
    pub title: String,
    pub description: String,
    pub duration_seconds: Option<u64>,
    pub first_run: Option<DateTime<FixedOffset>>,
    pub scope: Option<String>,
    pub stream_url: Option<String>,
    pub image_url: Option<String>,
    pub rating: Option<u8>,
    pub subtitles: Vec<Subtitle>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Subtitle {
    pub name: String,
    pub url: String,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Channel {
    Ruv,
    Ruv2,
}

impl Channel {
    pub const fn slug(self) -> &'static str {
        match self {
            Self::Ruv => "ruv",
            Self::Ruv2 => "ruv2",
        }
    }

    pub const fn title(self) -> &'static str {
        match self {
            Self::Ruv => "RÚV",
            Self::Ruv2 => "RÚV 2",
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ScheduleEvent {
    pub id: i64,
    pub title: String,
    pub subtitle: Option<String>,
    pub description: String,
    pub start: DateTime<FixedOffset>,
    pub end: Option<DateTime<FixedOffset>>,
    pub image_url: Option<String>,
    pub program_id: Option<i64>,
    pub episode_id: Option<String>,
    pub is_live: bool,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SearchResults {
    pub articles: Vec<Article>,
    pub programs: Vec<ProgramCard>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct HomeData {
    pub articles: Vec<Article>,
    pub shelves: Vec<VodShelf>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AppError {
    Network,
    InvalidResponse,
    ResponseTooLarge,
    UntrustedUrl,
    NotFound,
}

impl fmt::Display for AppError {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        let text = match self {
            Self::Network => "Ekki náðist samband við RÚV.",
            Self::InvalidResponse => "RÚV skilaði ógildum gögnum.",
            Self::ResponseTooLarge => "Gögn frá RÚV voru of stór.",
            Self::UntrustedUrl => "Ótraust veffang var stöðvað.",
            Self::NotFound => "Efnið fannst ekki.",
        };
        formatter.write_str(text)
    }
}

impl Error for AppError {}