chiark / gitweb /
bundles: Reorgsnise by_name_caseless
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 10 May 2021 18:38:51 +0000 (19:38 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 10 May 2021 18:38:51 +0000 (19:38 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bundles.rs

index e6ff1e0ba5ab4c11e8a0b1fcff4d83ff2144abbc..abaf548fb531e1347efdd35ea5e1ce9893f43488 100644 (file)
@@ -295,27 +295,13 @@ impl<R> IndexedZip<R> where R: Read + io::Seek {
     }
     IndexedZip { za, members }
   }
-}
 
-#[ext(pub)]
-impl<R> ZipArchive<R> where R: Read + io::Seek {
   #[throws(LoadError)]
-  fn by_name_caseless<'a>(&'a mut self, name: &str) -> ZipFile<'a>
+  fn by_name_caseless<'a>(&'a mut self, name: &str) -> Option<ZipFile<'a>>
   {
-    fn search<'a,R>(za: &'a mut ZipArchive<R>, name: &str)
-                    -> Result<usize, LoadError>
-    where R: Read + io::Seek
-    {
-      for i in 0..za.len() {
-        let m = za.by_index(i);
-        if matches!(m, Err(ZipError::FileNotFound)) { continue }
-        let m = m?;
-        if m.name_raw().eq_ignore_ascii_case(name.as_bytes()) { return Ok(i) }
-      }
-      return Err(LE::BadBundle(format!("bundle missing {}", name)));
-    }
-    let i = search(self, name)?;
-    self.by_index(i)?
+    if_let!{ Some(&i) = self.members.get(&UniCase::new(name.to_owned()));
+             else return Ok(None) }
+    Some(self.za.by_index(i)?)
   }
 }
 
@@ -404,7 +390,9 @@ where EH: BundleParseError,
   })?;
 
   let meta = EH::besteffort(bpath, ||{
-    let mut mf = za.by_name_caseless("otter.toml")?;
+    const META: &str = "otter.toml";
+    let mut mf = za.by_name_caseless(META)?
+      .ok_or_else(|| LE::BadBundle(format!("bundle missing {}", META)))?;
     let mut meta = String::new();
     mf.read_to_string(&mut meta).map_err(
       |e| LE::BadBundle(format!("access toml zip member: {}", e)))?;