chiark / gitweb /
occult ilks: change return value from PieceSpec::load
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 11 Mar 2021 11:15:36 +0000 (11:15 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 11 Mar 2021 11:29:02 +0000 (11:29 +0000)
Nothing sets this or uses it, yet.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
src/bin/otterlib.rs
src/gamestate.rs
src/hand.rs
src/pieces.rs
src/shapelib.rs

index 341aff51361df96fc10ce30783b2760e7326a7b6..a8f5a7e89e35496626bac9be8043a390522582b0 100644 (file)
@@ -607,7 +607,8 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
       let mut pos = pos.unwrap_or(DEFAULT_POS_START);
       let mut z = gs.max_z.clone_mut();
       for piece_i in count {
-        let p = info.load(piece_i as usize)?;
+        let PieceSpecLoaded { p, occultable } = info.load(piece_i as usize)?;
+        let _ = occultable; // xxx
         let face = face.unwrap_or_default();
         if p.nfaces() <= face.into() {
           throw!(SpecError::FaceNotFound);
index 3bfb664d9a912b24dcb885d732c6cd83c755e0c1..e3a5ffd66c2f552f4b0c202bfd359b99bbc2dfe0 100644 (file)
@@ -91,7 +91,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 = spec.clone().load().context("load")?;
+      let loaded = spec.clone().load().context("load")?;
+      let p = loaded.p; // xxx show occulted version too
       let mut uos = vec![];
       p.add_ui_operations(&mut uos, &GPiece::dummy()).context("add uos")?;
       let uos = uos.into_iter().map(|uo| uo.opname).collect::<Vec<_>>();
index 4ad94d4baef79dc23e743d95004ab9f910217f52..41fc3ea93e7aec27301cfbe82998d6925d260ed0 100644 (file)
@@ -180,10 +180,16 @@ pub struct ApiPieceOpArgs<'a> {
   pub p: &'a dyn PieceTrait,
 }
 
+#[derive(Debug)]
+pub struct PieceSpecLoaded {
+  pub p: Box<dyn PieceTrait>,
+  pub occultable: Option<(OccultIlkName, Box<dyn OccultedPieceTrait>)>,
+}
+
 #[typetag::serde(tag="type")]
 pub trait PieceSpec: Debug {
   fn count(&self) -> usize { 1 }
-  fn load(&self, i: usize) -> Result<Box<dyn PieceTrait>, SpecError>;
+  fn load(&self, i: usize) -> Result<PieceSpecLoaded, SpecError>;
 }
 
 // ========== implementations ==========
index 7551a53892ed0fe1ef9b4221142acf8bba548271..c3a26bc12144291a7bba2df70a4b9771b2e6ebac 100644 (file)
@@ -49,7 +49,7 @@ impl OutlineTrait for Hand {
 #[typetag::serde]
 impl PieceSpec for piece_specs::Hand {
   #[throws(SpecError)]
-  fn load(&self, _: usize) -> Box<dyn PieceTrait> {
+  fn load(&self, _: usize) -> PieceSpecLoaded {
     let common = SimpleCommon {
       itemname: None,
       faces: index_vec![ColourSpec(self.colour.clone())],
@@ -65,9 +65,10 @@ impl PieceSpec for piece_specs::Hand {
       shape,
       "magic-hand",
       &common)?;
-    Box::new(Hand {
+    let p = Box::new(Hand {
       shape,
-    }) as Box<dyn PieceTrait>
+    }) as Box<dyn PieceTrait>;
+    PieceSpecLoaded { p, occultable: None }
   }
 }
 
index 6962b3f4d046a298858e45368bb8e03f8023cbfe..370fccdebc143644f77f8bf853984ca1d0f3b730 100644 (file)
@@ -232,8 +232,9 @@ impl<Desc, Outl:'static> GenericSimpleShape<Desc, Outl>
 #[typetag::serde(tag="type")]
 pub trait SimplePieceSpec: Debug {
   fn load_raw(&self) -> Result<(SimpleShape, &SimpleCommon), SpecError>;
-  fn load(&self) -> Result<Box<dyn PieceTrait>, SpecError> {
-    Ok(Box::new(self.load_raw()?.0))
+  #[throws(SpecError)]
+  fn load(&self) -> PieceSpecLoaded {
+    PieceSpecLoaded { p: Box::new(self.load_raw()?.0), occultable: None }
   }
 }
 
@@ -254,7 +255,7 @@ impl SimplePieceSpec for piece_specs::Disc {
 #[typetag::serde]
 impl PieceSpec for piece_specs::Disc {
   #[throws(SpecError)]
-  fn load(&self, _: usize) -> Box<dyn PieceTrait> { SimplePieceSpec::load(self)? }
+  fn load(&self, _: usize) -> PieceSpecLoaded { SimplePieceSpec::load(self)? }
 }
 
 impl piece_specs::Square {
@@ -285,5 +286,5 @@ impl SimplePieceSpec for piece_specs::Square {
 #[typetag::serde]
 impl PieceSpec for piece_specs::Square {
   #[throws(SpecError)]
-  fn load(&self, _: usize) -> Box<dyn PieceTrait> { SimplePieceSpec::load(self)? }
+  fn load(&self, _: usize) -> PieceSpecLoaded { SimplePieceSpec::load(self)? }
 }
index 60dee0ed92829b812ba86dc6480a8cf8bee0542b..6717da5ac3b142edfe3579b8dc969e19c3bd448f 100644 (file)
@@ -194,7 +194,7 @@ pub fn libs_lookup(libname: &str)
 
 impl ItemSpec {
   #[throws(SpecError)]
-  pub fn load(&self) -> Box<dyn PieceTrait> {
+  pub fn load(&self) -> PieceSpecLoaded {
     let lib = libs_lookup(&self.lib)?;
     let idata = lib.items.get(&self.item)
       .ok_or(SpE::LibraryItemNotFound(self.item.clone()))?;
@@ -203,8 +203,8 @@ impl ItemSpec {
 }
 
 impl Contents {
-  fn load1(&self, idata: &ItemData, name: &str)
-           -> Result<Box<dyn PieceTrait>,SpecError> {
+  #[throws(SpecError)]
+  fn load1(&self, idata: &ItemData, name: &str) -> PieceSpecLoaded {
     let svg_path = format!("{}/{}.usvg", self.dirname, &name);
     let svg_data = fs::read_to_string(&svg_path)
       .map_err(|e| if e.kind() == ErrorKind::NotFound {
@@ -242,7 +242,8 @@ impl Contents {
 
     let it = Item { faces, descs, svgs, outline, desc_hidden,
                     itemname: name.to_string() };
-    Ok(Box::new(it))
+    let p = Box::new(it);
+    PieceSpecLoaded { p, occultable: None }
   }
 
   #[throws(MgmtError)]
@@ -257,11 +258,11 @@ impl Contents {
         e@ Err(_) => e?,
         Ok(r) => r,
       };
-      let f0bbox = loaded.bbox_approx()?;
+      let f0bbox = loaded.p.bbox_approx()?;
       let ier = ItemEnquiryData {
         itemname: k.clone(),
         f0bbox,
-        f0desc: loaded.describe_html(&GPiece::dummy())?,
+        f0desc: loaded.p.describe_html(&GPiece::dummy())?,
       };
       out.push(ier);
     }
@@ -271,7 +272,7 @@ impl Contents {
 
 #[typetag::serde(name="Lib")]
 impl PieceSpec for ItemSpec {
-  fn load(&self, _: usize) -> Result<Box<dyn PieceTrait>, SpecError> {
+  fn load(&self, _: usize) -> Result<PieceSpecLoaded, SpecError> {
     self.load()
   }
 }
@@ -279,7 +280,7 @@ impl PieceSpec for ItemSpec {
 #[typetag::serde(name="LibList")]
 impl PieceSpec for MultiSpec {
   fn count(&self) -> usize { self.items.len() }
-  fn load(&self, i: usize) -> Result<Box<dyn PieceTrait>,SpecError> {
+  fn load(&self, i: usize) -> Result<PieceSpecLoaded, SpecError> {
     let item = self.items.get(i).ok_or_else(
       || SpE::InternalError(format!("item {:?} from {:?}", i, &self))
     )?;