chiark / gitweb /
shapelib: Make note_svg fallible
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 22 May 2021 18:38:50 +0000 (19:38 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 22 May 2021 18:38:50 +0000 (19:38 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bundles.rs
src/shapelib.rs

index 2a87550de851bea85a3369d26ea287d07cdfa075..f9ba86e1a334250eed141d00ba2952709e22b439 100644 (file)
@@ -629,6 +629,7 @@ fn parse_bundle<EH>(id: Id, instance: &InstanceName,
   impl shapelib::LibrarySource for LibraryInBundle<'_> {
     fn catalogue_data(&self) -> &str { &self.catalogue_data }
     fn svg_dir(&self) -> String { self.svg_dir.clone() }
+    #[throws(shapelib::SubstError)]
     fn note_svg(&mut self, basename: &GoodItemName,
                 _src_name: Result<&str, &shapelib::SubstError>) {
       self.need_svgs.push(basename.clone())
index 5e2156469d32f9fce62a8fc546dab8f0109c66c8..3400c2af4addf25658812a553871760e95b75529 100644 (file)
@@ -202,9 +202,10 @@ impl<T> SvgBaseName<T> where T: ?Sized {
 }
 deref_to_field!{{ T: ?Sized } SvgBaseName<T>, T, 0 }
 impl<T> SvgBaseName<T> where T: Borrow<GoodItemName> {
+  #[throws(SubstError)]
   fn note(src: &mut dyn LibrarySource, i: T,
           src_name: Result<&str, &SubstError>) -> Self {
-    src.note_svg(i.borrow(), src_name);
+    src.note_svg(i.borrow(), src_name)?;
     SvgBaseName(i)
   }
 }
@@ -694,6 +695,7 @@ fn resolve_inherit<'r>(depth: u8, groups: &toml::value::Table,
 pub trait LibrarySource {
   fn catalogue_data(&self) -> &str;
   fn svg_dir(&self) -> String;
+  #[throws(SubstError)]
   fn note_svg(&mut self, _basename: &GoodItemName,
               _src_name: Result<&str, &SubstError>) { }
   fn bundle(&self) -> Option<bundles::Id>;
@@ -792,7 +794,7 @@ pub fn load_catalogue(libname: &str, src: &mut dyn LibrarySource) -> Contents {
           let item_name: GoodItemName = item_name.try_into()?;
           let item_name = SvgBaseName::note(
             src, Arc::new(item_name), src_name.as_ref().map(|s| s.as_str()),
-          );
+          )?;
           let desc = subst(&fe.desc, "_colour", "")?.to_html();
           OccData::Internal(Arc::new(OccData_Internal {
             item_name,
@@ -831,7 +833,7 @@ pub fn load_catalogue(libname: &str, src: &mut dyn LibrarySource) -> Contents {
         type H<'e,X,Y> = hash_map::Entry<'e,X,Y>;
         let new_item = SvgBaseName::note(
           src, item_name.clone(), src_name.clone()
-        );
+        )?;
         match l.items.entry(new_item) {
           H::Occupied(oe) => throw!(LLE::DuplicateItem {
             item: item_name.as_str().to_owned(),