chiark / gitweb /
introduce if_let!
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 1 Apr 2021 11:59:53 +0000 (12:59 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 2 Apr 2021 15:16:29 +0000 (16:16 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
apitest/at-otter.rs
base/misc.rs
base/prelude.rs
daemon/api.rs

index 06c5ed7c71560415364935104f5513afc66b5a5c..2a7ad118c4a5eeae722e35fc47c8d0fa25dd5321 100644 (file)
@@ -371,7 +371,7 @@ pub fn update_update_pieces<PI:Idx>(
   let v = v.as_object().unwrap();
   let piece = v["piece"].as_str().unwrap();
   let p = pieces.iter_mut().find(|p| p.id == piece);
-  let p = if let Some(p) = p { p } else { return };
+  if_let!{ Some(p) = p; else return }
   let (op, d) = v["op"].as_object().unwrap().iter().next().unwrap();
 
   fn coord(j: &JsV) -> Pos {
index 426c4ca9a8d1401d03d166383f536bfb98c07628..b97369d9f2ea3ffb2d496a53b72dabe3ab0071fe 100644 (file)
@@ -64,3 +64,13 @@ pub fn space_rect_attrs(table_size: PosC<f64>) -> SvgAttrs {
     (Html::lit("height"), table_size.y().to_html()  ),
   ]
 }
+
+#[macro_export]
+macro_rules! if_let {
+  { $variant:ident($binding:pat) = $input:expr; else $($otherwise:tt)* } => {
+    let $binding = match $input {
+      $variant(y) => y,
+      _ => { $($otherwise)* },
+    };
+  }
+}
index 143677e2f2ab1f54f9c51660ce12f33419aea2b8..092409b044d6d5aa71792134d51a508ac56e9ef2 100644 (file)
@@ -32,3 +32,5 @@ pub use crate::geometry::{CoordinateOverflow, PosC};
 pub use crate::{hformat, hformat_as_display, hwrite};
 pub use crate::misc::default;
 pub use crate::misc::display_as_debug;
+
+pub use crate::if_let;
index 902b36f1ac7509a8d0b3a6d8da2052ed44d8c8db..412919cbf9176737d359ed81860c7055385b7fbd 100644 (file)
@@ -121,7 +121,7 @@ fn api_piece_op<O: op::Complex>(form: Json<ApiPiece<O>>)
   let _ = iplayers.byid(player)?;
   let gpl = gs.players.byid(player)?;
   let piece = vpiece_decode(gs, player, gpl, form.piece);
-  let piece = if let Some(piece) = piece { piece } else { return Ok(()) };
+  if_let!{ Some(piece) = piece; else return Ok(()) }
   let was_held = gs.pieces.get(piece).as_ref().map(|gpc| gpc.held);
   use ApiPieceOpError::*;