From 72206b6f94fd281e3f06e12992303abbd0e27026 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 25 Mar 2021 19:16:50 +0000 Subject: [PATCH] piece aliases: Provide the Alias PieceSpec You can't use this because nothing every populates the aliaes array. Signed-off-by: Ian Jackson --- src/shapelib.rs | 37 +++++++++++++++++++++++++++++++++++++ src/spec.rs | 2 ++ 2 files changed, 39 insertions(+) diff --git a/src/shapelib.rs b/src/shapelib.rs index 728220c6..1bdcc978 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -459,6 +459,43 @@ impl Contents { } } +#[derive(Debug,Clone,Serialize,Deserialize)] +struct Alias { + target: String, +} + +impl Alias { + #[throws(SpecError)] + fn resolve<'a>(&self, pcaliases: &'a PieceAliases) -> &'a dyn PieceSpec { + Box::as_ref( + pcaliases + .get(&self.target) + .ok_or(SpecError::AliasNotFound)? + ) + } +} + +#[typetag::serde] +impl PieceSpec for Alias { + #[throws(SpecError)] + fn count(&self, pcaliases: &PieceAliases) -> usize { + // passing default() avoids resolving alias chains, so we don't + // have to worry about cycles + self.resolve(pcaliases)?.count(&default())? + } + #[throws(SpecError)] + fn load(&self, i: usize, gpc: &mut GPiece, + pcaliases: &PieceAliases, ir: &InstanceRef) + -> PieceSpecLoaded { + self.resolve(pcaliases)?.load(i, gpc, &default(), ir)? + } + #[throws(SpecError)] + fn load_occult(&self, pcaliases: &PieceAliases) + -> Box { + self.resolve(pcaliases)?.load_occult(&default())? + } +} + #[typetag::serde(name="Lib")] impl PieceSpec for ItemSpec { #[throws(SpecError)] diff --git a/src/spec.rs b/src/spec.rs index fca2ab6b..41a1b528 100644 --- a/src/spec.rs +++ b/src/spec.rs @@ -78,6 +78,8 @@ pub enum SpecError { UnsupportedShape, NegativeTimeout, ComplexPieceWhereSimpleRequired, + AliasNotFound, + AliasTargetMultiSpec, } display_as_debug!{SpecError} -- 2.30.2