From d9150c302f66cba28ab6bd8d05529ae516a1001c Mon Sep 17 00:00:00 2001 From: Oliver Atkinson Date: Fri, 16 May 2025 11:54:20 -0600 Subject: [PATCH] code cleanup --- src/texts/bible.rs | 114 +++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/src/texts/bible.rs b/src/texts/bible.rs index c990524..fca0b49 100644 --- a/src/texts/bible.rs +++ b/src/texts/bible.rs @@ -102,19 +102,9 @@ pub fn search_for_word(word: &str, from_files: &Bible) -> Vec { found } -pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result { - // expecting query to be in format: - // Gen 1:2 - // Gen 1:2-5 - // Gen 1 - // The book name needs to be just long enough to be unique - - let mut splits = chap_and_ver.split(':'); - let chapter = splits.next(); - let verse = splits.next(); - - // ########################################### - // Figure out what book they are talking about +fn parse_book(book: &str) -> Result<(usize, &str), String> { + // Go thru the list of books and see which + // match the passed book str let res = BOOKS_IN_ORDER .iter() .enumerate() @@ -144,34 +134,51 @@ pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result>(); - - // Select the chapter in each Bible - let chapters = if let Some(chapter) = chapter { - if let Ok(ch_num) = chapter.parse::() { - books - .iter() - .map(|(bible,book)| (bible, book, book.get_chapter_by_index(ch_num))) - .filter(|(_,_,book)| book.is_some()) - .map(|(bible,book,chapter)| (*bible,*book,chapter.unwrap())) - .collect::>() +fn parse_chapter<'a>(chapter_num: &str, book: &'a Book) -> Result<&'a Chapter, String> { + let chapter = if let Ok(idx) = chapter_num.parse::() { + if let Some(chapter) = book.get_chapter_by_index(idx) { + chapter } else { - return Err(format!("Chapter number could not be parsed from {chapter}")); + return Err(format!("Chapter {idx} doesn't exist in book {}", BOOKS_IN_ORDER[book.number-1])); } } else { - return Err(format!("A chapter was not passed")); + return Err(format!("Chapter number could not be parsed from {chapter_num}")); + }; + Ok(chapter) +} + +pub fn get(book: &str, chap_and_ver: &str, bible: &Bible) -> Result { + // expecting query to be in format: + // Gen 1:2 + // Gen 1:2-5 + // Gen 1 + // The book name needs to be just long enough to be unique + + let mut splits = chap_and_ver.split(':'); + let chapter_num = splits.next(); + let verse_num = splits.next(); + // ########################################### + + // Figure out what book they are talking about + let (book_idx, book_name) = parse_book(book)?; + + let book = match bible.get_book_by_index(book_idx+1) { + Some(s) => s, + None => return Err(format!("Selected Bible {} doesn't contain book {book_name}", bible.translation_name)), + }; + + // Figure out what chapter they are talking about + let chapter = if let Some(ch) = chapter_num { + parse_chapter(ch, book)? + } else { + return Err("No chapter number was passed".to_string()); }; // Get the verse in each Bible - match verse { + match verse_num { Some(verse) => { let mut splits = verse.split("-"); let start = splits.next(); @@ -183,16 +190,14 @@ pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result(), en.parse::()) { let mut buf = String::new(); - let translation = &chapters[0].0.translation_name; + let translation = &bible.translation_name; - buf += &format!("{style_bold}[{translation}] {style_underline}{book_name}:{start}-{end}{style_reset}\n"); + buf += &format!("{style_bold}[{translation}] {style_underline}{book_name}:{start}-{end}{style_reset}:\n"); for num in start..=end { - for (_, _, chapter) in &chapters { - if let Some(verse) = chapter.get_verse_by_index(num) { - buf += &format!( - "{}: {verse}\n", verse.number - ); - } + if let Some(verse) = chapter.get_verse_by_index(num) { + buf += &format!( + "{}: {verse}\n", verse.number + ); } } return Ok(buf); @@ -203,13 +208,11 @@ pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result { if let Ok(num) = ver_num.parse::() { let mut buf = String::new(); - for (bible, _book, chapter) in chapters { - if let Some(verse) = chapter.get_verse_by_index(num) { - buf += &format!( - "{style_bold}[{}] {style_underline}{book_name} {}:{}{style_reset}: {verse}\n", - bible.translation_name, chapter.number, verse.number - ); - } + if let Some(verse) = chapter.get_verse_by_index(num) { + buf += &format!( + "{style_bold}[{}] {style_underline}{book_name} {}:{}{style_reset}:\n{verse}\n", + bible.translation_name, chapter.number, verse.number + ); } return Ok(buf); } @@ -224,13 +227,11 @@ pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result { // only chapter let mut buf = String::new(); - for (bible, _, chapter) in chapters { - buf += &format!( - "{style_bold}[{}] {style_underline}{book_name} {}{style_reset}:\n", - bible.translation_name, chapter.number - ); - buf += &format!("{}", chapter); - } + buf += &format!( + "{style_bold}[{}] {style_underline}{book_name} {}{style_reset}:\n", + bible.translation_name, chapter.number + ); + buf += &format!("{}", chapter); return Ok(buf); } } @@ -291,6 +292,7 @@ struct Testament { #[derive(Deserialize)] struct Book { #[serde(rename = "@number")] + /// Genesis is book 1 number: usize, #[serde(rename = "chapter")] chapters: Vec,