use crate::slide::Slide; use crate::slides::creative_demo::{CreativeDemo, CreativeDemoCfg}; use crate::slides::demo::Demo; use crate::slides::projects::Projects; use crate::slides::spin_dog::{SpinDog, SpinDogCfg}; use crate::slides::standard_slide::{StandardSlide, StandardSlideConfig}; use crate::slides::title::Title; use config::Config; use serde::Deserialize; use std::path::{Path, PathBuf}; #[derive(Debug, Deserialize)] #[serde(tag = "type")] pub enum SlideType { Title { title: String }, Demo, Projects, StandardSlide(StandardSlideConfig), CreativeDemo(CreativeDemoCfg), SpinDog(SpinDogCfg), } impl SlideType { pub async fn slide(self, asset_dir: &Path) -> Box { match self { SlideType::Title { title } => Title::new(title), SlideType::Demo => Demo::new(), SlideType::Projects => Projects::new(), SlideType::StandardSlide(cfg) => StandardSlide::new(cfg, asset_dir).await, SlideType::CreativeDemo(cfg) => CreativeDemo::new(cfg), SlideType::SpinDog(cfg) => SpinDog::new(cfg, asset_dir).await, } } } #[derive(Debug, Deserialize)] pub struct SlideDeckConfig { pub assets_dir: PathBuf, pub slides: Vec, } impl SlideDeckConfig { pub fn new(src: &Path) -> Result { let cfg = Config::builder() .add_source(config::File::from(src)) .build()?; cfg.try_deserialize() } }