chiark / gitweb /
shapelib: Break out SubstError
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 22 May 2021 18:26:09 +0000 (19:26 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 22 May 2021 18:26:24 +0000 (19:26 +0100)
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 <ijackson@chiark.greenend.org.uk>
src/shapelib.rs

index 87249a7f314f8c844db556f1f11b0918a4a3fb3e..fb0054c91edb59d44426020c76b4c48cdfbda09a 100644 (file)
@@ -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() {