From: Ian Jackson Date: Fri, 13 May 2022 22:52:07 +0000 (+0100) Subject: shapelib: Implement Magic catalogue entries X-Git-Tag: otter-1.1.0~206 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=53315eda27f38d1cfa72cb00c1a9491977d22948;p=otter.git shapelib: Implement Magic catalogue entries But nothing constructs them. Signed-off-by: Ian Jackson --- diff --git a/src/shapelib.rs b/src/shapelib.rs index 393de394..eac29d07 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -51,6 +51,8 @@ struct ItemDetails { #[derive(Debug,Clone)] enum CatalogueEntry { Item(ItemData), + #[allow(dead_code)] // XXX + Magic { group: Arc, spec: Arc }, } use CatalogueEntry as CatEnt; @@ -433,9 +435,10 @@ impl ItemSpec { } #[throws(SpecError)] - fn find_load_general(&self, ig: &Instance, depth: SpecDepth, - mundanef: MUN) -> T + fn find_load_general(&self, ig: &Instance, depth: SpecDepth, + mundanef: MUN, magicf: MAG) -> T where MUN: FnOnce(ItemSpecLoaded) -> Result, + MAG: FnOnce(&Arc) -> Result, { self.find_then(ig, |lib, item, catent| Ok(match catent { CatEnt::Item(idata) => { @@ -443,6 +446,9 @@ impl ItemSpec { ig, depth)?; mundanef(loaded)? }, + CatEnt::Magic { spec,.. } => { + magicf(spec)? + }, }))? } @@ -451,6 +457,7 @@ impl ItemSpec { depth: SpecDepth) -> ItemSpecLoaded { self.find_load_general( ig, depth, |loaded| Ok(loaded), + |_| Err(SpE::ComplexPieceWhereInertRequired) )? } @@ -471,6 +478,7 @@ impl PieceSpec for ItemSpec { self.find_load_general( pla.ig, pla.depth, |loaded| Ok(loaded.into()), + |magic| magic.load(pla), )? } #[throws(SpecError)] @@ -667,6 +675,7 @@ fn resolve_square_size(size: &[T]) -> Option> { impl CatalogueEntry { fn group(&self) -> &Arc { match self { CatEnt::Item(item) => &item.group, + CatEnt::Magic{group,..} => group, } } } @@ -949,9 +958,10 @@ impl Catalogue { let pat = glob::Pattern::new(pat).map_err(|pe| ME::BadGlob { pat: pat.to_string(), msg: pe.msg.to_string() })?; let mut out = vec![]; + let ig_dummy = Instance::dummy(); for (k,v) in &self.items { if !pat.matches(k.as_str()) { continue } - let gpc = GPiece::dummy(); + let mut gpc = GPiece::dummy(); let loaded = match (|| Ok(match v { CatEnt::Item(item) => { let (loaded, _) = @@ -959,6 +969,14 @@ impl Catalogue { &Instance::dummy(), SpecDepth::zero())?; loaded as Box }, + CatEnt::Magic{spec,..} => { + spec.load(PieceLoadArgs { + i: 0, + gpc: &mut gpc, + ig: &ig_dummy, + depth: SpecDepth::zero(), + })?.p + } }))() { Err(SpecError::LibraryItemNotFound(_)) => continue, e@ Err(_) => e?,