From: Ian Jackson Date: Thu, 11 Mar 2021 11:15:36 +0000 (+0000) Subject: occult ilks: change return value from PieceSpec::load X-Git-Tag: otter-0.4.0~189 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=ada5d114f7b1ba0a647c5e861fb0166d26763602;p=otter.git occult ilks: change return value from PieceSpec::load Nothing sets this or uses it, yet. Signed-off-by: Ian Jackson --- diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index 341aff51..a8f5a7e8 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -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); diff --git a/src/bin/otterlib.rs b/src/bin/otterlib.rs index 3bfb664d..e3a5ffd6 100644 --- a/src/bin/otterlib.rs +++ b/src/bin/otterlib.rs @@ -91,7 +91,8 @@ fn preview(items: Vec) { let mut pieces: Vec = 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::>(); diff --git a/src/gamestate.rs b/src/gamestate.rs index 4ad94d4b..41fc3ea9 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -180,10 +180,16 @@ pub struct ApiPieceOpArgs<'a> { pub p: &'a dyn PieceTrait, } +#[derive(Debug)] +pub struct PieceSpecLoaded { + pub p: Box, + pub occultable: Option<(OccultIlkName, Box)>, +} + #[typetag::serde(tag="type")] pub trait PieceSpec: Debug { fn count(&self) -> usize { 1 } - fn load(&self, i: usize) -> Result, SpecError>; + fn load(&self, i: usize) -> Result; } // ========== implementations ========== diff --git a/src/hand.rs b/src/hand.rs index 7551a538..c3a26bc1 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -49,7 +49,7 @@ impl OutlineTrait for Hand { #[typetag::serde] impl PieceSpec for piece_specs::Hand { #[throws(SpecError)] - fn load(&self, _: usize) -> Box { + 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 + }) as Box; + PieceSpecLoaded { p, occultable: None } } } diff --git a/src/pieces.rs b/src/pieces.rs index 6962b3f4..370fccde 100644 --- a/src/pieces.rs +++ b/src/pieces.rs @@ -232,8 +232,9 @@ impl GenericSimpleShape #[typetag::serde(tag="type")] pub trait SimplePieceSpec: Debug { fn load_raw(&self) -> Result<(SimpleShape, &SimpleCommon), SpecError>; - fn load(&self) -> Result, 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 { 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 { SimplePieceSpec::load(self)? } + fn load(&self, _: usize) -> PieceSpecLoaded { SimplePieceSpec::load(self)? } } diff --git a/src/shapelib.rs b/src/shapelib.rs index 60dee0ed..6717da5a 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -194,7 +194,7 @@ pub fn libs_lookup(libname: &str) impl ItemSpec { #[throws(SpecError)] - pub fn load(&self) -> Box { + 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,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, SpecError> { + fn load(&self, _: usize) -> Result { 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,SpecError> { + fn load(&self, i: usize) -> Result { let item = self.items.get(i).ok_or_else( || SpE::InternalError(format!("item {:?} from {:?}", i, &self)) )?;