use std::io;
use std::path::PathBuf;
use thiserror::Error;
pub type ResultChirho<T> = Result<T, ErrorChirho>;
#[derive(Error, Debug)]
pub enum ErrorChirho {
#[error("I/O error: {0}")]
IoChirho(#[from] io::Error),
#[error("Module not found: {module_name_chirho}")]
ModuleNotFoundChirho {
module_name_chirho: String,
},
#[error("Invalid module path: {path_chirho}")]
InvalidModulePathChirho {
path_chirho: PathBuf,
},
#[error("Invalid verse reference: {reference_chirho}")]
InvalidVerseReferenceChirho {
reference_chirho: String,
},
#[error("Invalid book name: {book_name_chirho}")]
InvalidBookNameChirho {
book_name_chirho: String,
},
#[error("Verse out of bounds: {book_chirho} {chapter_chirho}:{verse_chirho}")]
VerseOutOfBoundsChirho {
book_chirho: String,
chapter_chirho: u32,
verse_chirho: u32,
},
#[error("Chapter out of bounds: {book_chirho} {chapter_chirho} (max: {max_chapter_chirho})")]
ChapterOutOfBoundsChirho {
book_chirho: String,
chapter_chirho: u32,
max_chapter_chirho: u32,
},
#[error("Invalid module configuration: {message_chirho}")]
InvalidConfigChirho {
message_chirho: String,
},
#[error("Missing configuration key: {key_chirho}")]
MissingConfigKeyChirho {
key_chirho: String,
},
#[error("Unsupported module type: {module_type_chirho}")]
UnsupportedModuleTypeChirho {
module_type_chirho: String,
},
#[error("Unsupported compression: {compression_type_chirho}")]
UnsupportedCompressionChirho {
compression_type_chirho: String,
},
#[error("Decompression error: {message_chirho}")]
DecompressionChirho {
message_chirho: String,
},
#[error("Compression error: {message_chirho}")]
CompressionChirho {
message_chirho: String,
},
#[error("Invalid index format: expected {expected_chirho} bytes, got {actual_chirho}")]
InvalidIndexFormatChirho {
expected_chirho: usize,
actual_chirho: usize,
},
#[error("Cipher key required for module: {module_name_chirho}")]
CipherKeyRequiredChirho {
module_name_chirho: String,
},
#[error("Invalid cipher key for module: {module_name_chirho}")]
InvalidCipherKeyChirho {
module_name_chirho: String,
},
#[error("Network error: {message_chirho}")]
NetworkChirho {
message_chirho: String,
},
#[error("Download error: {url_chirho}: {message_chirho}")]
DownloadChirho {
url_chirho: String,
message_chirho: String,
},
#[error("Installation error: {message_chirho}")]
InstallationChirho {
message_chirho: String,
},
#[error("XML parsing error: {message_chirho}")]
XmlParseChirho {
message_chirho: String,
},
#[error("Parse error: {message_chirho}")]
ParseChirho {
message_chirho: String,
},
#[error("Encoding error: {message_chirho}")]
EncodingChirho {
message_chirho: String,
},
#[error("Search error: {message_chirho}")]
SearchChirho {
message_chirho: String,
},
#[error("Invalid versification system: {v11n_chirho}")]
InvalidVersificationChirho {
v11n_chirho: String,
},
#[error("Module is read-only: {module_name_chirho}")]
ReadOnlyModuleChirho {
module_name_chirho: String,
},
#[error("Entry not found: {key_chirho}")]
EntryNotFoundChirho {
key_chirho: String,
},
#[error("UTF-8 decode error: {0}")]
Utf8Chirho(#[from] std::string::FromUtf8Error),
#[error("UTF-8 str error: {0}")]
Utf8StrChirho(#[from] std::str::Utf8Error),
#[error("Integer parse error: {0}")]
ParseIntChirho(#[from] std::num::ParseIntError),
#[error("{0}")]
GenericChirho(String),
}
impl ErrorChirho {
pub fn generic_chirho<S: Into<String>>(message_chirho: S) -> Self {
Self::GenericChirho(message_chirho.into())
}
pub fn module_not_found_chirho<S: Into<String>>(module_name_chirho: S) -> Self {
Self::ModuleNotFoundChirho {
module_name_chirho: module_name_chirho.into(),
}
}
pub fn invalid_verse_reference_chirho<S: Into<String>>(reference_chirho: S) -> Self {
Self::InvalidVerseReferenceChirho {
reference_chirho: reference_chirho.into(),
}
}
pub fn invalid_config_chirho<S: Into<String>>(message_chirho: S) -> Self {
Self::InvalidConfigChirho {
message_chirho: message_chirho.into(),
}
}
pub fn missing_config_key_chirho<S: Into<String>>(key_chirho: S) -> Self {
Self::MissingConfigKeyChirho {
key_chirho: key_chirho.into(),
}
}
pub fn xml_parse_chirho<S: Into<String>>(message_chirho: S) -> Self {
Self::XmlParseChirho {
message_chirho: message_chirho.into(),
}
}
pub fn network_chirho<S: Into<String>>(message_chirho: S) -> Self {
Self::NetworkChirho {
message_chirho: message_chirho.into(),
}
}
pub fn search_chirho<S: Into<String>>(message_chirho: S) -> Self {
Self::SearchChirho {
message_chirho: message_chirho.into(),
}
}
pub fn verse_out_of_bounds_chirho<S: AsRef<str>>(reference_chirho: S) -> Self {
let ref_str_chirho = reference_chirho.as_ref();
Self::VerseOutOfBoundsChirho {
book_chirho: ref_str_chirho.to_string(),
chapter_chirho: 0,
verse_chirho: 0,
}
}
pub fn verse_out_of_bounds_explicit_chirho<S: Into<String>>(
book_chirho: S,
chapter_chirho: u32,
verse_chirho: u32,
) -> Self {
Self::VerseOutOfBoundsChirho {
book_chirho: book_chirho.into(),
chapter_chirho,
verse_chirho,
}
}
pub fn parse_chirho<S: Into<String>>(message_chirho: S) -> Self {
Self::ParseChirho {
message_chirho: message_chirho.into(),
}
}
pub fn key_not_found_chirho<S: Into<String>>(key_chirho: S) -> Self {
Self::EntryNotFoundChirho {
key_chirho: key_chirho.into(),
}
}
}
#[cfg(test)]
mod tests_chirho {
use super::*;
#[test]
fn test_error_display_chirho() {
let error_chirho = ErrorChirho::module_not_found_chirho("KJV");
assert_eq!(error_chirho.to_string(), "Module not found: KJV");
}
#[test]
fn test_generic_error_chirho() {
let error_chirho = ErrorChirho::generic_chirho("Something went wrong");
assert_eq!(error_chirho.to_string(), "Something went wrong");
}
#[test]
fn test_verse_out_of_bounds_chirho() {
let error_chirho = ErrorChirho::VerseOutOfBoundsChirho {
book_chirho: "Genesis".to_string(),
chapter_chirho: 1,
verse_chirho: 100,
};
assert_eq!(error_chirho.to_string(), "Verse out of bounds: Genesis 1:100");
}
}