From f6a196aeca3331605140a84cd0f9206432cf9d27 Mon Sep 17 00:00:00 2001 From: Ellen Emilia Anna Zscheile Date: Sat, 29 Mar 2025 16:08:39 +0100 Subject: [PATCH] fix(drawing): make update_this_and_outward_bows fail graceful (with temporary fix) --- src/drawing/drawing.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/drawing/drawing.rs b/src/drawing/drawing.rs index e814b20..6ffa7aa 100644 --- a/src/drawing/drawing.rs +++ b/src/drawing/drawing.rs @@ -534,14 +534,11 @@ impl Drawing { } } - #[debug_ensures(self.recording_geometry_with_rtree.graph().node_count() == old(self.recording_geometry_with_rtree.graph().node_count()))] - #[debug_ensures(self.recording_geometry_with_rtree.graph().edge_count() == old(self.recording_geometry_with_rtree.graph().edge_count()))] - fn update_this_and_outward_bows( + fn update_this_and_outward_bows_intern( &mut self, recorder: &mut DrawingEdit, around: LooseBendIndex, ) -> Result<(), DrawingException> { - // FIXME: Fail gracefully on infringement. let mut maybe_rail = Some(around); while let Some(rail) = maybe_rail { @@ -594,6 +591,24 @@ impl Drawing { Ok(()) } + #[debug_ensures(self.recording_geometry_with_rtree.graph().node_count() == old(self.recording_geometry_with_rtree.graph().node_count()))] + #[debug_ensures(self.recording_geometry_with_rtree.graph().edge_count() == old(self.recording_geometry_with_rtree.graph().edge_count()))] + fn update_this_and_outward_bows( + &mut self, + recorder: &mut DrawingEdit, + around: LooseBendIndex, + ) -> Result<(), DrawingException> { + let mut temp_recorder = DrawingEdit::new(); + let ret = self.update_this_and_outward_bows_intern(&mut temp_recorder, around); + if ret.is_ok() { + recorder.apply(&temp_recorder); + } else { + temp_recorder.reverse_inplace(); + self.recording_geometry_with_rtree.apply(&temp_recorder); + } + ret + } + #[debug_ensures(ret.is_ok() -> self.recording_geometry_with_rtree.graph().node_count() == old(self.recording_geometry_with_rtree.graph().node_count() + 4))] #[debug_ensures(ret.is_ok() -> self.recording_geometry_with_rtree.graph().edge_count() >= old(self.recording_geometry_with_rtree.graph().edge_count() + 5))] #[debug_ensures(ret.is_err() -> self.recording_geometry_with_rtree.graph().node_count() == old(self.recording_geometry_with_rtree.graph().node_count()))]