chiark / gitweb /
piece aliases: Provide the Alias PieceSpec
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Mar 2021 19:16:50 +0000 (19:16 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Mar 2021 19:19:08 +0000 (19:19 +0000)
You can't use this because nothing every populates the aliaes array.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/shapelib.rs
src/spec.rs

index 728220c61fdc8a1e37582b4f1682d68a48c35229..1bdcc97867b0a07b3d1980e97294c887c95c4880 100644 (file)
@@ -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<dyn OccultedPieceTrait> {
+    self.resolve(pcaliases)?.load_occult(&default())?
+  }
+}
+
 #[typetag::serde(name="Lib")]
 impl PieceSpec for ItemSpec {
   #[throws(SpecError)]
index fca2ab6b9855ff134382b842a945ca2deb906a46..41a1b528d919e9b62eff4d1d44d8e8af086e1227 100644 (file)
@@ -78,6 +78,8 @@ pub enum SpecError {
   UnsupportedShape,
   NegativeTimeout,
   ComplexPieceWhereSimpleRequired,
+  AliasNotFound,
+  AliasTargetMultiSpec,
 }
 display_as_debug!{SpecError}