#[non_exhaustive]
#[derive(thiserror::Error, Debug)]
pub enum EpubError {
#[error("Required attribute missing: {0}")]
MissingAttribute(String),
#[error("Required text value is missing for element <{0}>")]
MissingValue(String),
#[error("Unencoded href (percent-encoding required): {0}")]
UnencodedHref(String),
#[error("Missing `rootfile` element referencing an `.opf` file in `META-INF/container.xml`")]
NoOpfReference,
#[error("Missing `package` element")]
NoPackageFound,
#[error("Invalid package epub `version`: {0}")]
InvalidVersion(String),
#[error(
"Invalid package `unique-identifier` referencing a non-existent `dc:identifier` entry by ID: {0}"
)]
InvalidUniqueIdentifier(String),
#[error("Invalid package `prefix`: {0}")]
InvalidPrefix(String),
#[error("Missing `metadata` element")]
NoMetadataFound,
#[error("Invalid `refines` field referencing a non-existent id: {0}")]
InvalidRefines(String),
#[error("Missing `dc:title` metadata entry")]
MissingTitle,
#[error("Missing `dc:language` metadata entry")]
MissingLanguage,
#[error("Cycle detected in metadata refinements; affected ID: {0}")]
CyclicMeta(String),
#[error("Missing `manifest` element")]
NoManifestFound,
#[error("Duplicate manifest `item` ID found: {0}")]
DuplicateItemId(String),
#[error("Manifest missing an `item` with the 'nav' property (Required for EPUB 3)")]
NoXhtmlTocReference,
#[error("Missing `spine` element")]
NoSpineFound,
#[error(
"Invalid spine entry `idref` field that references a non-existent manifest entry by ID: {0}"
)]
InvalidIdref(String),
#[error("Invalid spine `toc` field that references a non-existent manifest entry by ID: {0}")]
InvalidNcxReference(String),
#[error("Missing spine `toc` field (Required for EPUB 2)")]
NoNcxReference,
#[error("No navigation structure (nav or navMap) found in the ToC resource")]
NoTocFound,
}