ServiceItems are loaded from lisp and converted to slides
This commit is contained in:
parent
cb7fa372a9
commit
db39eb12b8
9 changed files with 283 additions and 125 deletions
174
src/lisp.rs
174
src/lisp.rs
|
@ -3,30 +3,25 @@ use std::{fs::read_to_string, path::PathBuf};
|
|||
use crisp::types::{Symbol, Value};
|
||||
use tracing::error;
|
||||
|
||||
use crate::{core::songs::lisp_to_song, Slide};
|
||||
use crate::{
|
||||
core::{service_items::ServiceItem, songs::lisp_to_song},
|
||||
Slide,
|
||||
};
|
||||
|
||||
pub fn parse_lisp(value: Value) -> Vec<Slide> {
|
||||
pub fn parse_lisp(value: Value) -> Vec<ServiceItem> {
|
||||
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" => {
|
||||
let song = lisp_to_song(vec.clone());
|
||||
match Slide::song_slides(&song) {
|
||||
Ok(s) => s,
|
||||
Err(e) => {
|
||||
error!("Couldn't load song: {e}");
|
||||
vec![Slide::default()]
|
||||
}
|
||||
}
|
||||
Value::Symbol(Symbol(s))
|
||||
if s == "slide" || s == "song" =>
|
||||
{
|
||||
let item = ServiceItem::from(value.clone());
|
||||
vec![item]
|
||||
}
|
||||
Value::Symbol(Symbol(s)) if s == "load" => {
|
||||
let Ok(path) = PathBuf::from(String::from(&vec[1]))
|
||||
.canonicalize()
|
||||
else {
|
||||
return vec![Slide::default()];
|
||||
return vec![ServiceItem::default()];
|
||||
};
|
||||
let lisp = read_to_string(path).expect("oops");
|
||||
let lisp_value = crisp::reader::read(&lisp);
|
||||
|
@ -48,7 +43,13 @@ pub fn parse_lisp(value: Value) -> Vec<Slide> {
|
|||
mod test {
|
||||
use std::{fs::read_to_string, path::PathBuf};
|
||||
|
||||
use crate::{Background, SlideBuilder, TextAlignment};
|
||||
use crate::{
|
||||
core::{
|
||||
images::Image, kinds::ServiceItemKind, songs::Song,
|
||||
videos::Video,
|
||||
},
|
||||
Background, SlideBuilder, TextAlignment,
|
||||
};
|
||||
|
||||
use super::*;
|
||||
use pretty_assertions::assert_eq;
|
||||
|
@ -58,15 +59,15 @@ mod test {
|
|||
let lisp =
|
||||
read_to_string("./test_slides.lisp").expect("oops");
|
||||
let lisp_value = crisp::reader::read(&lisp);
|
||||
let test_vec = vec![test_slide(), test_second_slide()];
|
||||
let test_vec = vec![service_item_1(), service_item_2()];
|
||||
match lisp_value {
|
||||
Value::List(value) => {
|
||||
let mut slide_vec = vec![];
|
||||
let mut item_vec = vec![];
|
||||
for value in value {
|
||||
let mut vec = parse_lisp(value);
|
||||
slide_vec.append(&mut vec);
|
||||
item_vec.append(&mut vec);
|
||||
}
|
||||
assert_eq!(slide_vec, test_vec)
|
||||
assert_eq!(item_vec, test_vec)
|
||||
}
|
||||
_ => panic!("this should be a lisp"),
|
||||
}
|
||||
|
@ -77,76 +78,95 @@ mod test {
|
|||
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(), song_slide()];
|
||||
let test_vec = vec![
|
||||
service_item_1(),
|
||||
service_item_2(),
|
||||
service_item_3(),
|
||||
];
|
||||
match lisp_value {
|
||||
Value::List(value) => {
|
||||
let mut slide_vec = vec![];
|
||||
let mut item_vec = vec![];
|
||||
for value in value {
|
||||
let mut vec = parse_lisp(value);
|
||||
slide_vec.append(&mut vec);
|
||||
item_vec.append(&mut vec);
|
||||
}
|
||||
let first_lisp_slide = &slide_vec[0];
|
||||
let second_lisp_slide = &slide_vec[1];
|
||||
let third_lisp_slide = &slide_vec[2];
|
||||
assert_eq!(first_lisp_slide, &test_vec[0]);
|
||||
assert_eq!(second_lisp_slide, &test_vec[1]);
|
||||
assert_eq!(third_lisp_slide, &test_vec[2]);
|
||||
let item_1 = &item_vec[0];
|
||||
let item_2 = &item_vec[1];
|
||||
let item_3 = &item_vec[2];
|
||||
assert_eq!(item_1, &test_vec[0]);
|
||||
assert_eq!(item_2, &test_vec[1]);
|
||||
assert_eq!(item_3, &test_vec[2]);
|
||||
|
||||
assert_eq!(slide_vec, test_vec);
|
||||
assert_eq!(item_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 service_item_1() -> ServiceItem {
|
||||
ServiceItem {
|
||||
title: "frodo.jpg".to_string(),
|
||||
kind: ServiceItemKind::Image(Image {
|
||||
title: "frodo.jpg".to_string(),
|
||||
path: PathBuf::from("~/pics/frodo.jpg"),
|
||||
..Default::default()
|
||||
}),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
fn service_item_2() -> ServiceItem {
|
||||
ServiceItem {
|
||||
title: "camprules2024.mp4".to_string(),
|
||||
kind: ServiceItemKind::Video(Video {
|
||||
title: "camprules2024.mp4".to_string(),
|
||||
path: PathBuf::from("~/vids/test/camprules2024.mp4"),
|
||||
start_time: None,
|
||||
end_time: None,
|
||||
looping: false,
|
||||
..Default::default()
|
||||
}),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn song_slide() -> Slide {
|
||||
SlideBuilder::new()
|
||||
.text("Death Was Arrested\nNorth Point Worship")
|
||||
.background(
|
||||
Background::try_from("~/nc/tfc/openlp/CMG - Bright Mountains 01.jpg")
|
||||
.unwrap(),
|
||||
)
|
||||
.font("Quicksand Bold")
|
||||
.font_size(60)
|
||||
.text_alignment(TextAlignment::MiddleCenter)
|
||||
.audio(PathBuf::from("file:///home/chris/music/North Point InsideOut/Nothing Ordinary, Pt. 1 (Live)/05 Death Was Arrested (feat. Seth Condrey).mp3"))
|
||||
.video_loop(true)
|
||||
.video_start_time(0.0)
|
||||
.video_end_time(0.0)
|
||||
.build()
|
||||
.unwrap()
|
||||
fn service_item_3() -> ServiceItem {
|
||||
ServiceItem {
|
||||
title: "Death Was Arrested".to_string(),
|
||||
kind: ServiceItemKind::Song(test_song()),
|
||||
database_id: 7,
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn test_song() -> Song {
|
||||
Song {
|
||||
id: 7,
|
||||
title: "Death Was Arrested".to_string(),
|
||||
lyrics: Some("Intro 1\nDeath Was Arrested\nNorth Point Worship\n\nVerse 1\nAlone in my sorrow\nAnd dead in my sin\n\nLost without hope\nWith no place to begin\n\nYour love made a way\nTo let mercy come in\n\nWhen death was arrested\nAnd my life began\n\nVerse 2\nAsh was redeemed\nOnly beauty remains\n\nMy orphan heart\nWas given a name\n\nMy mourning grew quiet,\nMy feet rose to dance\n\nWhen death was arrested\nAnd my life began\n\nChorus 1\nOh, Your grace so free,\nWashes over me\n\nYou have made me new,\nNow life begins with You\n\nIt's Your endless love,\nPouring down on us\n\nYou have made us new,\nNow life begins with You\n\nVerse 3\nReleased from my chains,\nI'm a prisoner no more\n\nMy shame was a ransom\nHe faithfully bore\n\nHe cancelled my debt and\nHe called me His friend\n\nWhen death was arrested\nAnd my life began\n\nVerse 4\nOur Savior displayed\nOn a criminal's cross\n\nDarkness rejoiced as though\nHeaven had lost\n\nBut then Jesus arose\nWith our freedom in hand\n\nThat's when death was arrested\nAnd my life began\n\nThat's when death was arrested\nAnd my life began\n\nBridge 1\nOh, we're free, free,\nForever we're free\n\nCome join the song\nOf all the redeemed\n\nYes, we're free, free,\nForever amen\n\nWhen death was arrested\nAnd my life began\n\nOh, we're free, free,\nForever we're free\n\nCome join the song\nOf all the redeemed\n\nYes, we're free, free,\nForever amen\n\nWhen death was arrested\nAnd my life began\n\nEnding 1\nWhen death was arrested\nAnd my life began\n\nThat's when death was arrested\nAnd my life began".to_string()),
|
||||
author: Some(
|
||||
"North Point Worship".to_string(),
|
||||
),
|
||||
ccli: None,
|
||||
audio: Some("file:///home/chris/music/North Point InsideOut/Nothing Ordinary, Pt. 1 (Live)/05 Death Was Arrested (feat. Seth Condrey).mp3".into()),
|
||||
verse_order: Some(vec![
|
||||
"I1".to_string(),
|
||||
"V1".to_string(),
|
||||
"V2".to_string(),
|
||||
"C1".to_string(),
|
||||
"V3".to_string(),
|
||||
"C1".to_string(),
|
||||
"V4".to_string(),
|
||||
"C1".to_string(),
|
||||
"B1".to_string(),
|
||||
"B1".to_string(),
|
||||
"E1".to_string(),
|
||||
"E2".to_string(),
|
||||
]),
|
||||
background: Some(Background::try_from("file:///home/chris/nc/tfc/openlp/CMG - Bright Mountains 01.jpg").unwrap()),
|
||||
text_alignment: Some(TextAlignment::MiddleCenter),
|
||||
font: Some("Quicksand Bold".to_string()),
|
||||
font_size: Some(60)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue