chiark / gitweb /
piece aliases: Pass about everywhere, esp. to PieceSpec methods
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Mar 2021 18:21:15 +0000 (18:21 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Mar 2021 19:18:59 +0000 (19:18 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
src/bin/otterlib.rs
src/clock.rs
src/deck.rs
src/gamestate.rs
src/hand.rs
src/pieces.rs
src/shapelib.rs

index a41d1eedda3c6d9b18c3306e852f9e08e241e3dd..0c46a1cd18e85f22c0611a3a003e376d04f3abbf 100644 (file)
@@ -635,7 +635,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
       let gref = ig_g.gref.clone();
       let ig = &mut **ig_g;
       let gs = &mut ig.gs;
-      let implicit: u32 = info.count()
+      let implicit: u32 = info.count(&ig.pcaliases)
         .try_into().map_err(
           |_| SpE::InternalError(format!("implicit item count out of range"))
         )?;
@@ -678,7 +678,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
           moveable: default(),
         };
         let PieceSpecLoaded { p, occultable } =
-          info.load(piece_i as usize, &mut gpc, &gref)?;
+          info.load(piece_i as usize, &mut gpc, &ig.pcaliases, &gref)?;
         if p.nfaces() <= face.into() {
           throw!(SpecError::FaceNotFound);
         }
index 5617bc708393e045d5ef008385f3571f0173a508..340739cb389ed571ff1455a84e5ba68bc5b43b30 100644 (file)
@@ -77,6 +77,7 @@ fn preview(items: Vec<ItemForOutput>) {
   }
 
   const SEVERAL: usize = 3;
+  let pcaliases = default();
 
   impl Prep {
     fn want_several(&self) -> bool {
@@ -91,7 +92,8 @@ fn preview(items: Vec<ItemForOutput>) {
   let mut pieces: Vec<Prep> = items.into_iter().map(|it| {
     let spec = ItemSpec { lib: it.0, item: it.1.itemname };
     (||{
-      let (p, _occultable) = spec.clone().find_load().context("load")?;
+      let (p, _occultable) = spec.clone().find_load(&pcaliases)
+        .context("load")?;
       // todo show occulted version too
       let mut uos = vec![];
       p.add_ui_operations(&mut uos, &GameState::dummy(), &GPiece::dummy())
index 0d7fedf4f86610eaba1c925595dc6d944cfb11eb..070889dfc960a349e547f6c7b9b9724f439dc632 100644 (file)
@@ -403,7 +403,8 @@ fn unprepared_update(piece: PieceId) -> UnpreparedUpdates {
 #[typetag::serde(name="ChessClock")]
 impl PieceSpec for Spec {
   #[throws(SpecError)]
-  fn load(&self, _: usize, gpc: &mut GPiece, _ir: &InstanceRef)
+  fn load(&self, _: usize, gpc: &mut GPiece,
+          _pcaliases: &PieceAliases, _ir: &InstanceRef)
           -> PieceSpecLoaded {
     if self.time <= 0 { throw!(SpecError::NegativeTimeout) }
 
index 6a708e10284ead145ee06dd084a904a3066ccd41..f9eb1606c2846441523311f849238d50e03ed96e 100644 (file)
@@ -37,7 +37,8 @@ impl OutlineTrait for Deck {
 #[typetag::serde(name="PickupDeck")]
 impl PieceSpec for piece_specs::Deck {
   #[throws(SpecError)]
-  fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef)
+  fn load(&self, _: usize, _: &mut GPiece,
+          _pcaliases: &PieceAliases, _ir: &InstanceRef)
           -> PieceSpecLoaded {
     let common = SimpleCommon {
       itemname: None,
index 7183c3988ce510dbc95aef6071321b64d41c9986..8952ee2df94feb6afad6a2e51df9b06fa83d0df2 100644 (file)
@@ -201,10 +201,12 @@ pub type PieceSpecLoadedOccultable =
 
 #[typetag::serde(tag="type")]
 pub trait PieceSpec: Debug + Sync + Send + 'static {
-  fn count(&self) -> usize { 1 }
-  fn load(&self, i: usize, gpc: &mut GPiece, ir: &InstanceRef)
+  fn count(&self, _pcaliases: &PieceAliases) -> usize { 1 }
+  fn load(&self, i: usize, gpc: &mut GPiece,
+          pcaliases: &PieceAliases, ir: &InstanceRef)
           -> Result<PieceSpecLoaded, SpecError>;
-  fn load_occult(&self) -> Result<Box<dyn OccultedPieceTrait>, SpecError> {
+  fn load_occult(&self, _pcaliases: &PieceAliases)
+                 -> Result<Box<dyn OccultedPieceTrait>, SpecError> {
     throw!(SpE::ComplexPieceWhereSimpleRequired)
   }
 }
index a49ebeee45d16ba4a57b0ec48b6cfb6a61b89434..27b3825ecc167c6d143a3a489a337b041332af45 100644 (file)
@@ -50,7 +50,8 @@ impl OutlineTrait for Hand {
 #[typetag::serde]
 impl PieceSpec for piece_specs::Hand {
   #[throws(SpecError)]
-  fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef)
+  fn load(&self, _: usize, _: &mut GPiece,
+          _pcaliases: &PieceAliases, _ir: &InstanceRef)
           -> PieceSpecLoaded {
     let common = SimpleCommon {
       itemname: None,
index f8f2a65c400ebcc1ce99719ce805b89e709c039b..9befa20eae34954415bb63829ed25dc85ad9bd48 100644 (file)
@@ -294,7 +294,8 @@ impl SimplePieceSpec for piece_specs::Disc {
 #[typetag::serde]
 impl PieceSpec for piece_specs::Disc {
   #[throws(SpecError)]
-  fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef)
+  fn load(&self, _: usize, _: &mut GPiece,
+          _pcaliases: &PieceAliases, _ir: &InstanceRef)
           -> PieceSpecLoaded {
     SimplePieceSpec::load(self)?
   }
@@ -332,7 +333,8 @@ impl SimplePieceSpec for piece_specs::Rect {
 #[typetag::serde]
 impl PieceSpec for piece_specs::Rect {
   #[throws(SpecError)]
-  fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef)
+  fn load(&self, _: usize, _: &mut GPiece,
+          _pcaliases: &PieceAliases, _ir: &InstanceRef)
           -> PieceSpecLoaded {
     SimplePieceSpec::load(self)?
   }
index e2b4bb3528c698d3f5af5d396d37a36a6d3c8ae6..4a6eafc974a658382bc8b6fac3615a6da5752d16 100644 (file)
@@ -339,11 +339,11 @@ impl From<ItemSpecLoaded> for PieceSpecLoaded {
 
 impl ItemSpec {
   #[throws(SpecError)]
-  pub fn find_load(&self) -> ItemSpecLoaded {
+  pub fn find_load(&self, pcaliases: &PieceAliases) -> ItemSpecLoaded {
     let lib = libs_lookup(&self.lib)?;
     let idata = lib.items.get(&self.item)
       .ok_or(SpE::LibraryItemNotFound(self.item.clone()))?;
-    lib.load1(idata, &self.item)?
+    lib.load1(idata, &self.item, pcaliases)?
   }
 }
 
@@ -366,7 +366,8 @@ impl Contents {
   }
 
   #[throws(SpecError)]
-  fn load1(&self, idata: &ItemData, name: &str) -> ItemSpecLoaded {
+  fn load1(&self, idata: &ItemData, name: &str, pcaliases: &PieceAliases)
+           -> ItemSpecLoaded {
     let svg_data = self.load_svg(name, name)?;
 
     idata.group.d.outline.check(&idata.group)
@@ -389,7 +390,7 @@ impl Contents {
       face.xform.scale[0] *= -1.;
       faces.push(face);
     } else if let Some(back_spec) = &idata.group.d.back {
-      let p = back_spec.load_occult()?;
+      let p = back_spec.load_occult(pcaliases)?;
       let p = p.into();
       back = Some(p);
     }
@@ -441,7 +442,7 @@ impl Contents {
     let mut out = vec![];
     for (k,v) in &self.items {
       if !pat.matches(&k) { continue }
-      let (loaded, _) = match self.load1(v, &k) {
+      let (loaded, _) = match self.load1(v, &k, &default()) {
         Err(SpecError::LibraryItemNotFound(_)) => continue,
         e@ Err(_) => e?,
         Ok(r) => r,
@@ -461,22 +462,25 @@ impl Contents {
 #[typetag::serde(name="Lib")]
 impl PieceSpec for ItemSpec {
   #[throws(SpecError)]
-  fn load(&self, _: usize, _: &mut GPiece, _ir: &InstanceRef)
+  fn load(&self, _: usize, _: &mut GPiece,
+          pcaliases: &PieceAliases, _ir: &InstanceRef)
           -> PieceSpecLoaded {
-    self.find_load()?.into()
+    self.find_load(pcaliases)?.into()
   }
   #[throws(SpecError)]
-  fn load_occult(&self) -> Box<dyn OccultedPieceTrait> {
-    self.find_load()?.0 as Box<dyn OccultedPieceTrait>
+  fn load_occult(&self, pcaliases: &PieceAliases)
+                 -> Box<dyn OccultedPieceTrait> {
+    self.find_load(pcaliases)?.0 as Box<dyn OccultedPieceTrait>
   }
 }
 
 #[typetag::serde(name="LibList")]
 impl PieceSpec for MultiSpec {
-  fn count(&self) -> usize { self.items.len() }
+  fn count(&self, _pcaliases: &PieceAliases) -> usize { self.items.len() }
 
   #[throws(SpecError)]
-  fn load(&self, i: usize, _: &mut GPiece, _ir: &InstanceRef)
+  fn load(&self, i: usize, _: &mut GPiece,
+          pcaliases: &PieceAliases, _ir: &InstanceRef)
           -> PieceSpecLoaded
   {
     let item = self.items.get(i).ok_or_else(
@@ -484,7 +488,7 @@ impl PieceSpec for MultiSpec {
     )?;
     let item = format!("{}{}{}", &self.prefix, item, &self.suffix);
     let lib = self.lib.clone();
-    ItemSpec { lib, item }.find_load()?.into()
+    ItemSpec { lib, item }.find_load(pcaliases)?.into()
   }
 }