code cleanup

This commit is contained in:
Oliver Atkinson 2025-05-16 11:54:20 -06:00
parent 46e4030f46
commit d9150c302f

View File

@ -102,19 +102,9 @@ pub fn search_for_word(word: &str, from_files: &Bible) -> Vec<String> {
found
}
pub fn get(book: &str, chap_and_ver: &str, bibles: Vec<&Bible>) -> Result<String, String> {
// 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<String
return Err(format!("'{book}' is not a book"));
}
};
Ok((book_idx, book_name))
}
// Select the book in each Bible
let books = bibles
.iter()
// Book are 1 indexed in the xml spec
.map(|bible| (bible, bible.get_book_by_index(book_idx + 1)))
.filter(|(_,e)| e.is_some())
.map(|(bible,book)| (*bible,book.unwrap()))
.collect::<Vec<(&Bible,&Book)>>();
// Select the chapter in each Bible
let chapters = if let Some(chapter) = chapter {
if let Ok(ch_num) = chapter.parse::<usize>() {
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::<Vec<(&Bible, &Book, &Chapter)>>()
fn parse_chapter<'a>(chapter_num: &str, book: &'a Book) -> Result<&'a Chapter, String> {
let chapter = if let Ok(idx) = chapter_num.parse::<usize>() {
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<String, String> {
// 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<String
if let (Ok(start), Ok(end)) = (sn.parse::<usize>(), en.parse::<usize>()) {
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<String
(Some(ver_num), None) => {
if let Ok(num) = ver_num.parse::<usize>() {
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<String
None => {
// 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<Chapter>,