diff --git a/Cargo.lock b/Cargo.lock index 9725a70..7f30019 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -499,6 +499,7 @@ dependencies = [ "dirs", "fastrand 2.1.1", "obws", + "pretty_assertions", "quote", "reqwest", "rfd", @@ -781,6 +782,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "digest" version = "0.10.7" @@ -2054,6 +2061,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -3646,6 +3663,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "youtube_dl" version = "0.8.1" diff --git a/src/rust/core/Cargo.toml b/src/rust/core/Cargo.toml index e36be44..93d3d2f 100644 --- a/src/rust/core/Cargo.toml +++ b/src/rust/core/Cargo.toml @@ -42,6 +42,7 @@ time = { version = "0.3.29", features = ["formatting", "macros"] } obws = "0.13.0" reqwest = "0.11.23" color-eyre = "0.6.3" +pretty_assertions = "1.4.1" # ffmpeg-next = "6.0.0" # cxx-qt-build generates C++ code from the `#[cxx_qt::bridge]` module diff --git a/src/rust/core/images.rs b/src/rust/core/images.rs index 67ea561..86ab52c 100644 --- a/src/rust/core/images.rs +++ b/src/rust/core/images.rs @@ -1,5 +1,5 @@ pub struct Image { - title: String, + _title: String, } #[cfg(test)] diff --git a/src/rust/core/model.rs b/src/rust/core/model.rs index c3bfccf..7f5e167 100644 --- a/src/rust/core/model.rs +++ b/src/rust/core/model.rs @@ -91,5 +91,4 @@ pub trait Modeling { #[cfg(test)] mod test { - use super::*; } diff --git a/src/rust/core/slides.rs b/src/rust/core/slides.rs index 31d2639..238ae02 100644 --- a/src/rust/core/slides.rs +++ b/src/rust/core/slides.rs @@ -1,6 +1,7 @@ -use std::path::PathBuf; +use std::{error::Error, fmt::Display, path::PathBuf}; -use color_eyre::eyre::Result; +use color_eyre::eyre::{eyre, Result}; +use tracing::debug; use crate::{ images::Image, kinds::ServiceItemKind, @@ -21,19 +22,81 @@ pub enum TextAlignment { BottomRight, } +#[derive(Clone, Debug, Default, PartialEq, Eq)] +pub struct Background { + path: PathBuf, + kind: BackgroundKind, +} + +impl TryFrom for Background { + type Error = ParseError; + fn try_from(value: String) -> Result { + let extension = value.rsplit_once('.').unwrap_or_default(); + match extension.0 { + "jpg" | "png" | "webp" => Ok(Self { + path: PathBuf::from(value), + kind: BackgroundKind::Image, + }), + "mp4" | "mkv" | "webm" => Ok(Self { + path: PathBuf::from(value), + kind: BackgroundKind::Video, + }), + _ => Err(ParseError::NonBackgroundFile) + } + } +} + +impl TryFrom for Background { + type Error = ParseError; + fn try_from(value: PathBuf) -> Result { + let extension = value.extension().unwrap_or_default().to_str().unwrap_or_default(); + match extension { + "jpg" | "png" | "webp" => Ok(Self { + path: value, + kind: BackgroundKind::Image, + }), + "mp4" | "mkv" | "webm" => Ok(Self { + path: value, + kind: BackgroundKind::Video, + }), + _ => Err(ParseError::NonBackgroundFile) + } + } +} + + +#[derive(Debug)] +pub enum ParseError { + NonBackgroundFile, +} + +impl Error for ParseError {} + +impl Display for ParseError { + fn fmt( + &self, + f: &mut std::fmt::Formatter<'_>, + ) -> std::fmt::Result { + let message = match self { + Self::NonBackgroundFile => "The file is not a recognized image or video type", + }; + write!(f, "Error: {message}") + } +} + #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -pub enum Background { +pub enum BackgroundKind { #[default] Image, Video, } -impl From for Background { +impl From for BackgroundKind { fn from(value: String) -> Self { if value == "image" { - Background::Image + BackgroundKind::Image } else { - Background::Video + BackgroundKind::Video } } } @@ -42,7 +105,7 @@ impl From for Background { struct Slide { id: i32, database_id: i32, - background: PathBuf, + background: Background, text: String, font: String, font_size: i32, @@ -75,9 +138,13 @@ impl From for Slide { } impl From