From: Ian Jackson Date: Sat, 22 May 2021 18:26:09 +0000 (+0100) Subject: shapelib: Break out SubstError X-Git-Tag: otter-0.6.0~72 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=ca6d93f5da16098152169bf0b15e0672cdf1aa4d;p=otter.git shapelib: Break out SubstError We are going to want to clone this, so it has to be separate from LibraryLoadError which contains an io::Error and can't be cloned. Signed-off-by: Ian Jackson --- diff --git a/src/shapelib.rs b/src/shapelib.rs index 87249a7f..fb0054c9 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -106,12 +106,9 @@ pub enum LibraryLoadError { FilesListLineMissingWhitespace(usize), #[error("files list line {0}, field must be at start")] FilesListFieldsMustBeAtStart(usize), - #[error("missing or unrecognised substitution token {0}")] - MissingSubstituionToken(&'static str), - #[error("repeated substitution token {0}")] - RepeatedSubstituionToken(&'static str), #[error("piece defines multiple faces in multiple ways")] MultipleMultipleFaceDefinitions, + #[error("bad substitution: {0}")] BadSubstitution(#[from] SubstError), #[error("{0}")] UnsupportedColourSpec(#[from] UnsupportedColourSpec), #[error("bad item name (invalid characters) in {0:?}")] BadItemName(String), } @@ -122,6 +119,13 @@ impl LibraryLoadError { } } +#[derive(Error,Copy,Clone,Debug)] +pub enum SubstError { + #[error("missing or unrecognised token {0}")] MissingToken (&'static str), + #[error("repeated token {0}")] RepeatedToken(&'static str), +} + + const INHERIT_DEPTH_LIMIT: u8 = 20; type TV = toml::Value; @@ -739,15 +743,13 @@ pub fn load_catalogue(libname: &str, src: &mut dyn LibrarySource) -> Contents { throw!(LLE::MultipleMultipleFaceDefinitions) } for fe in gdefn.files.0 { - #[throws(LLE)] + #[throws(SubstError)] fn subst(before: &str, needle: &'static str, replacement: &str) -> String { + use SubstError as SE; let mut matches = before.match_indices(needle); - let m1 = matches.next() - .ok_or(LLE::MissingSubstituionToken(needle))?; - if matches.next().is_some() { - Err(LLE::RepeatedSubstituionToken(needle))?; - } + let m1 = matches.next().ok_or(SE::MissingToken(needle))?; + if matches.next().is_some() { Err(SE::RepeatedToken(needle))?; } let mut lhs = &before[0.. m1.0]; let mut rhs = &before[m1.0 + m1.1.len() ..]; if replacement.is_empty() {