From 1f314e3a7a9842b9db1cafbef85354a6386f716d Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Fri, 29 Nov 2024 22:10:29 -0600 Subject: [PATCH] adding a bit more to the lisp_to_song fn --- src/core/songs.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/core/songs.rs b/src/core/songs.rs index 64a8d9e..fa5367e 100644 --- a/src/core/songs.rs +++ b/src/core/songs.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, path::PathBuf}; use cosmic::{executor, iced::Executor}; -use crisp::types::{Keyword, Value}; +use crisp::types::{Keyword, Symbol, Value}; use miette::{miette, IntoDiagnostic, Result}; use serde::{Deserialize, Serialize}; use sqlx::{ @@ -222,11 +222,67 @@ fn lisp_to_song(list: Vec) -> Song { let verse_order = if let Some(verse_order) = list.get(verse_order_position) { - Some(String::from(verse_order)) + match verse_order { + Value::List(vals) => Some( + vals.into_iter() + .map(|v| String::from(v)) + .collect::>(), + ), + _ => None, + } } else { None }; + let first_text_postiion = if let Some(pos) = + list.iter().position(|v| match v { + Value::List(inner) => match &inner[0] { + Value::Symbol(Symbol(text)) => { + text.contains("v1") + || text.contains("text") + || text.contains("c1") + } + _ => false, + }, + _ => false, + }) { + pos + } else { + 1 + }; + + let lyric_elements = &list[first_text_postiion..]; + + let mut lyric_list = if let Some(ref verse_order) = verse_order { + Vec::with_capacity(verse_order.capacity()) + } else { + vec![] + }; + + for element in lyric_elements { + let Value::List(lyric) = element else { + continue; + }; + let Value::Symbol(Symbol(verse)) = &lyric[0] else { + continue; + }; + + let lyric = String::from(&lyric[1]); + let Some(ref verse_order) = verse_order else { + lyric_list.push(lyric); + continue; + }; + + let Some(verse_pos) = + verse_order.iter().position(|v| v == verse) + else { + error!("Should be a verse here"); + continue; + }; + + lyric_list.insert(verse_pos, lyric); + } + todo!() }