chiark / gitweb /
shapelib: Plumb src_name through to make_usvg
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 22 May 2021 19:29:12 +0000 (20:29 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 22 May 2021 20:29:56 +0000 (21:29 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bundles.rs
src/shapelib.rs

index f9ba86e1a334250eed141d00ba2952709e22b439..29a84f9de150d88357934a9af9f6cc6407961e3c 100644 (file)
@@ -118,7 +118,13 @@ struct ForProcess {
 struct ForProcessLib {
   dir_inzip: String,
   svg_dir: String,
-  need_svgs: Vec<GoodItemName>,
+  need_svgs: Vec<SvgNoted>,
+}
+
+#[derive(Debug,Clone)]
+struct SvgNoted {
+  item: GoodItemName,
+  src_name: String,
 }
 
 const BUNDLES_MAX: Index = Index(64);
@@ -622,7 +628,7 @@ fn parse_bundle<EH>(id: Id, instance: &InstanceName,
   struct LibraryInBundle<'l> {
     catalogue_data: String,
     svg_dir: &'l String,
-    need_svgs: Vec<GoodItemName>,
+    need_svgs: Vec<SvgNoted>,
     id: &'l Id,
   }
 
@@ -631,8 +637,14 @@ fn parse_bundle<EH>(id: Id, instance: &InstanceName,
     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())
+                src_name: Result<&str, &shapelib::SubstError>) {
+      let src_name = if src_name.unwrap_or_else(|e| e.input.as_str()) == "-" {
+        basename.as_str().to_string()
+      } else {
+        src_name.map_err(Clone::clone)?.to_string()
+      };
+      let item = basename.clone();
+      self.need_svgs.push(SvgNoted { item, src_name });
     }
     fn bundle(&self) -> Option<bundles::Id> { Some(*self.id) }
   }
@@ -688,9 +700,9 @@ fn process_bundle(ForProcess { mut za, mut newlibs }: ForProcess,
     fs::create_dir(&svg_dir)
       .with_context(|| svg_dir.clone()).context("mkdir").map_err(IE::from)?;
       
-    for item in mem::take(need_svgs) {
+    for SvgNoted { item, src_name } in mem::take(need_svgs) {
       make_usvg(&mut za, &mut svg_count, for_progress,
-                dir_inzip, svg_dir, &item)?;
+                dir_inzip, svg_dir, &item, &src_name)?;
     }
   }
 }
@@ -744,7 +756,7 @@ fn image_usvg(zfname: &str, input: File, output: File,
 fn make_usvg(za: &mut IndexedZip, progress_count: &mut usize,
              mut for_progress: &mut dyn progress::Originator,
              dir_inzip: &str, svg_dir: &str,
-             item: &GoodItemName) {
+             item: &GoodItemName, _src_name: &str) {
   let (format, mut zf) = 'format: loop {
     for format in PictureFormat::iter() {
       let input_basename = format!("{}/{}.{}", dir_inzip, item, format);
index a9b0601dd58f6fba6f21202cbd6b7588f8777596..f01681378522a1736744db61751c0caa5a626514 100644 (file)
@@ -128,8 +128,8 @@ pub enum SubstErrorKind {
 #[derive(Error,Clone,Debug)]
 #[error("bad substitution: {input:?} {kind}")]
 pub struct SubstError {
-  kind: SubstErrorKind,
-  input: String,
+  pub kind: SubstErrorKind,
+  pub input: String,
 }