gui is working

This commit is contained in:
Oliver Atkinson
2025-03-26 15:06:06 -06:00
parent 09acb5af50
commit 2874617e4c
6 changed files with 4203 additions and 41 deletions

View File

@@ -73,14 +73,14 @@ pub const BOOKS_IN_ORDER: [&str; 66] = [
"Revelation",
];
pub fn get(query: &str, location: &str, files: Vec<PathBuf>) {
pub fn get(book: &str, chap_and_ver: &str, from_files: Vec<PathBuf>) -> Option<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 = location.split(':');
let mut splits = chap_and_ver.split(':');
let chapter = splits.next();
let verse = splits.next();
@@ -89,26 +89,26 @@ pub fn get(query: &str, location: &str, files: Vec<PathBuf>) {
let res = BOOKS_IN_ORDER
.iter()
.enumerate()
.filter(|(_, book)| book.to_lowercase().contains(&query.to_lowercase()))
.filter(|(_, lbook)| lbook.to_lowercase().contains(&book.trim().to_lowercase()))
.collect::<Vec<(usize, &&str)>>();
let (book_idx, book_name) = match res.len() {
1 => res[0],
2.. => {
eprintln!("Err: Ambigious input '{query}', could be any of:");
eprintln!("Err: Ambigious input '{book}', could be any of:");
for (_, i) in &res {
eprintln!("\t{i}");
}
return;
return None;
}
_ => {
eprintln!("'{query}' is not a book");
return;
eprintln!("'{book}' is not a book");
return None;
}
};
// Load Bibles into memory
let bibles = files
let bibles = from_files
.iter()
.filter_map(|path| fs::read_to_string(path).ok())
.filter_map(|contents| from_str::<Bible>(&contents).ok())
@@ -132,10 +132,10 @@ pub fn get(query: &str, location: &str, files: Vec<PathBuf>) {
.map(|(bible,book,chapter)| (*bible,*book,chapter.unwrap()))
.collect::<Vec<(&Bible, &Book, &Chapter)>>()
} else {
return;
return None;
}
} else {
return;
return None;
};
// Get the verse in each Bible
@@ -149,46 +149,54 @@ pub fn get(query: &str, location: &str, files: Vec<PathBuf>) {
// range of verses
(Some(sn), Some(en)) => {
if let (Ok(start), Ok(end)) = (sn.parse::<usize>(), en.parse::<usize>()) {
let mut buf = String::new();
for num in start..=end {
for (bible, _book, chapter) in &chapters {
if let Some(verse) = chapter.get_verse_by_index(num) {
println!(
"{style_bold}[{}] {style_underline}{book_name} {}:{}{style_reset}: {verse}",
buf += &format!(
"{style_bold}[{}] {style_underline}{book_name} {}:{}{style_reset}: {verse}\n",
bible.translation_name, chapter.number, verse.number
);
}
}
}
return Some(buf);
}
return None;
}
// only one verse
(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) {
println!(
"{style_bold}[{}] {style_underline}{book_name} {}:{}{style_reset}: {verse}",
buf += &format!(
"{style_bold}[{}] {style_underline}{book_name} {}:{}{style_reset}: {verse}\n",
bible.translation_name, chapter.number, verse.number
);
}
}
return Some(buf);
}
return None;
}
_ => {
// couldn't parse verse
return;
return None;
}
}
}
None => {
// only chapter
for (bible, _book, chapter) in chapters {
println!(
"{style_bold}[{}] {style_underline}{book_name} {}{style_reset}:",
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
);
print!("{}", chapter);
buf += &format!("{}", chapter);
}
return Some(buf);
}
}
}