From: Ian Jackson Date: Sat, 22 May 2021 18:38:50 +0000 (+0100) Subject: shapelib: Make note_svg fallible X-Git-Tag: otter-0.6.0~68 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=33de8463e39daccdd1416588e91d9e21925ee5d0;p=otter.git shapelib: Make note_svg fallible Signed-off-by: Ian Jackson --- diff --git a/src/bundles.rs b/src/bundles.rs index 2a87550d..f9ba86e1 100644 --- a/src/bundles.rs +++ b/src/bundles.rs @@ -629,6 +629,7 @@ fn parse_bundle(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()) diff --git a/src/shapelib.rs b/src/shapelib.rs index 5e215646..3400c2af 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -202,9 +202,10 @@ impl SvgBaseName where T: ?Sized { } deref_to_field!{{ T: ?Sized } SvgBaseName, T, 0 } impl SvgBaseName where T: Borrow { + #[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; @@ -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(),