From: Ian Jackson Date: Tue, 11 May 2021 19:09:27 +0000 (+0100) Subject: shapelib: Provide IndexedZip etc. X-Git-Tag: otter-0.6.0~345 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=d9a3c8da091a59b3d0597ca8efef7e226b785055;p=otter.git shapelib: Provide IndexedZip etc. Signed-off-by: Ian Jackson --- diff --git a/src/bundles.rs b/src/bundles.rs index abaf548f..63703f0a 100644 --- a/src/bundles.rs +++ b/src/bundles.rs @@ -272,9 +272,11 @@ pub struct IndexedZip where R: Read + io::Seek { deref_to_field_mut!{{ R: Read + io::Seek } IndexedZip, ZipArchive>, za } +pub struct ZipIndex(pub usize); + impl IndexedZip where R: Read + io::Seek { #[throws(LoadError)] - fn new(file: R) -> Self { + pub fn new(file: R) -> Self { let file = BufReader::new(file); let mut za = ZipArchive::new(file)?; let mut members = BTreeMap::new(); @@ -297,12 +299,25 @@ impl IndexedZip where R: Read + io::Seek { } #[throws(LoadError)] - fn by_name_caseless<'a>(&'a mut self, name: &str) -> Option> + pub fn by_name_caseless<'a>(&'a mut self, name: &str) -> Option> { if_let!{ Some(&i) = self.members.get(&UniCase::new(name.to_owned())); else return Ok(None) } Some(self.za.by_index(i)?) } + + #[throws(LoadError)] + pub fn i<'z>(&'z mut self, i: ZipIndex) -> ZipFile<'z> { + self.by_index(i.0)? + } +} + +impl<'z,R> IntoIterator for &'z IndexedZip where R: Read + io::Seek { + type Item = (&'z UniCase, ZipIndex); + type IntoIter = impl Iterator; + fn into_iter(self) -> Self::IntoIter { + self.members.iter().map(|(name,&index)| (name, ZipIndex(index))) + } } trait BundleParseError: Sized {