}
}
+#[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)]