From: Ian Jackson Date: Thu, 25 Mar 2021 19:16:50 +0000 (+0000) Subject: piece aliases: Provide the Alias PieceSpec X-Git-Tag: otter-0.5.0~405 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=72206b6f94fd281e3f06e12992303abbd0e27026;p=otter.git piece aliases: Provide the Alias PieceSpec You can't use this because nothing every populates the aliaes array. Signed-off-by: Ian Jackson --- 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}