chiark / gitweb /
otter: Show bundle in library information
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 15 May 2021 23:09:02 +0000 (00:09 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 15 May 2021 23:32:13 +0000 (00:32 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bundles.rs
src/shapelib.rs

index ce970a5e1e95f5775ece0af3f22a0f255cbd2dc1..e2f27f4b6cf5be8b4841f827a48e1ebcddf031e8 100644 (file)
@@ -574,6 +574,7 @@ fn parse_bundle<EH>(id: Id, instance: &InstanceName, file: File, eh: EH,
     catalogue_data: String,
     svg_dir: &'l String,
     need_svgs: Vec<GoodItemName>,
+    id: &'l Id,
   }
 
   impl shapelib::LibrarySource for LibraryInBundle<'_> {
@@ -582,6 +583,7 @@ fn parse_bundle<EH>(id: Id, instance: &InstanceName, file: File, eh: EH,
     fn note_svg(&mut self, basename: &GoodItemName) {
       self.need_svgs.push(basename.clone())
     }
+    fn bundle(&self) -> Option<bundles::Id> { Some(*self.id) }
   }
 
   for (progress_count, LibScanned { libname, dir_inzip, inzip })
@@ -600,6 +602,7 @@ fn parse_bundle<EH>(id: Id, instance: &InstanceName, file: File, eh: EH,
         catalogue_data: catalogue_data,
         svg_dir: &svg_dir,
         need_svgs: Vec::new(),
+        id: &id,
       };
       let contents = shapelib::load_catalogue(&libname, &mut src)
         .map_err(|e| LE::badlib(&libname, &e))?;
index 48de1858d14f989e201d4ef219cafc59447c5250..1322ea553d3c0200e4353fa0cd3a39adc4b4855d 100644 (file)
@@ -38,6 +38,7 @@ pub trait OutlineDefn: Debug + Sync + Send + 'static {
 pub struct Contents {
   libname: String,
   dirname: String,
+  bundle: Option<bundles::Id>,
   items: HashMap<SvgBaseName<GoodItemName>, ItemData>,
 }
 
@@ -247,11 +248,15 @@ impl Display for ItemEnquiryData {
 
 #[derive(Debug,Clone,Serialize,Deserialize,Eq,PartialEq,Ord,PartialOrd)]
 pub struct LibraryEnquiryData {
+  pub bundle: Option<bundles::Id>,
   pub libname: String,
 }
 impl Display for LibraryEnquiryData {
   #[throws(fmt::Error)]
   fn fmt(&self, f: &mut Formatter) {
+    if let Some(id) = self.bundle.as_ref() {
+      write!(f, "[{}] ", id)?;
+    }
     if self.libname.chars().all(|c| {
       c.is_alphanumeric() || c=='-' || c=='_' || c=='.'
     }) {
@@ -589,6 +594,7 @@ impl Contents {
   pub fn enquiry(&self) -> LibraryEnquiryData {
     LibraryEnquiryData {
       libname: self.libname.clone(),
+      bundle: self.bundle,
     }
   }
 
@@ -686,6 +692,7 @@ pub trait LibrarySource {
   fn catalogue_data(&self) -> &str;
   fn svg_dir(&self) -> String;
   fn note_svg(&mut self, _basename: &GoodItemName) { }
+  fn bundle(&self) -> Option<bundles::Id>;
 }
 
 struct BuiltinLibrary<'l> {
@@ -696,12 +703,14 @@ struct BuiltinLibrary<'l> {
 impl LibrarySource for BuiltinLibrary<'_> {
   fn catalogue_data(&self) -> &str { self.catalogue_data }
   fn svg_dir(&self) -> String { self.dirname.to_string() }
+  fn bundle(&self) -> Option<bundles::Id> { None }
 }
 
 #[throws(LibraryLoadError)]
 pub fn load_catalogue(libname: &str, src: &mut dyn LibrarySource) -> Contents {
   let toplevel: toml::Value = src.catalogue_data().parse()?;
   let mut l = Contents {
+    bundle: src.bundle(),
     libname: libname.to_string(),
     items: HashMap::new(),
     dirname: src.svg_dir(),