From 53ba0385f567bb97ce6068537e986dd0cb86cf45 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Wed, 20 Nov 2024 14:05:22 -0600 Subject: [PATCH] preps for actually reading slides in from lisp --- src/lisp.rs | 93 ++++++++++++++++++++++++++++++++++++++++++++++------- src/main.rs | 31 ++++++++++++++++-- 2 files changed, 111 insertions(+), 13 deletions(-) diff --git a/src/lisp.rs b/src/lisp.rs index 3ed0172..77b6ad4 100644 --- a/src/lisp.rs +++ b/src/lisp.rs @@ -1,14 +1,85 @@ -use crisp::{ - env::Environment, - types::{Symbol, Value}, -}; +use crisp::types::{Symbol, Value}; -use crate::{Slide, SlideBuilder}; +use crate::Slide; -pub fn setup_env() { - let mut env = Environment::new(); - env.insert_symbol( - Symbol::from("slide"), - Value::func(|args| Ok(Value::from(args))), - ) +pub fn parse_lisp(value: Value, vector: Vec) -> Vec { + match &value { + Value::List(vec) => match &vec[0] { + Value::Symbol(Symbol(s)) if s == "slide" => { + let slide = Slide::from(value.clone()); + vec![slide] + } + Value::Symbol(Symbol(s)) if s == "song" => { + vec![Slide::default()] + } + Value::Symbol(Symbol(s)) if s == "load" => { + vec![Slide::default()] + } + _ => todo!(), + }, + _ => todo!(), + } +} + +#[cfg(test)] +mod test { + use std::fs::read_to_string; + + use crate::{Background, SlideBuilder, TextAlignment}; + + use super::*; + use pretty_assertions::assert_eq; + + #[test] + fn test_parsing_lisp() { + let lisp = + read_to_string("./test_presentation.lisp").expect("oops"); + let lisp_value = crisp::reader::read(&lisp); + let test_vec = vec![test_slide(), test_second_slide()]; + match lisp_value { + Value::List(value) => { + let mut slide_vec = vec![]; + for value in value { + let inner_vector = vec![]; + let mut vec = parse_lisp(value, inner_vector); + slide_vec.append(&mut vec); + } + assert_eq!(slide_vec, test_vec) + } + _ => panic!("this should be a lisp"), + } + } + + fn test_slide() -> Slide { + SlideBuilder::new() + .text("This is frodo") + .background( + Background::try_from("~/pics/frodo.jpg").unwrap(), + ) + .font("Quicksand") + .font_size(70) + .text_alignment(TextAlignment::MiddleCenter) + .video_loop(false) + .video_start_time(0.0) + .video_end_time(0.0) + .build() + .unwrap() + } + + fn test_second_slide() -> Slide { + SlideBuilder::new() + .text("") + .background( + Background::try_from("~/vids/test/camprules2024.mp4") + .unwrap(), + ) + .font("Quicksand") + .font_size(0) + .text_alignment(TextAlignment::MiddleCenter) + .video_loop(false) + .video_start_time(0.0) + .video_end_time(0.0) + .build() + .unwrap() + } } diff --git a/src/main.rs b/src/main.rs index fec594b..55b254e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,8 +13,12 @@ use cosmic::widget::{ use cosmic::widget::{icon, slider}; use cosmic::{executor, Application, ApplicationExt, Element}; use cosmic::{widget::Container, Theme}; +use crisp::types::Value; +use lisp::parse_lisp; use miette::{miette, Result}; +use std::fs::read_to_string; use std::path::PathBuf; +use tracing::warn; use tracing::{debug, level_filters::LevelFilter}; use tracing_subscriber::EnvFilter; @@ -144,6 +148,29 @@ impl cosmic::Application for App { windows.push(core.main_window_id().unwrap()); } + let slides = match read_to_string(input.file) { + Ok(lisp) => { + let mut slide_vector = vec![]; + let lisp = crisp::reader::read(&lisp); + match lisp { + Value::List(vec) => { + for value in vec { + let inner_vector = vec![]; + let mut inner_vector = + parse_lisp(value, inner_vector); + slide_vector.append(&mut inner_vector); + } + } + _ => todo!(), + } + slide_vector + } + Err(e) => { + warn!("Missing file or could not read: {e}"); + vec![] + } + }; + let initial_slide = SlideBuilder::new() .background( Background::try_from( @@ -191,8 +218,8 @@ impl cosmic::Application for App { .build() .expect("oops slide"); - let slides = - vec![initial_slide.clone(), second_slide, tetrary_slide]; + // let slides = + // vec![initial_slide.clone(), second_slide, tetrary_slide]; let presenter = Presenter::with_slides(slides.clone()); let mut app = App { presenter,