From a83618908669dd307b758642f1664d143c3493fe Mon Sep 17 00:00:00 2001 From: Ellen Emilia Anna Zscheile Date: Tue, 18 Mar 2025 03:44:48 +0100 Subject: [PATCH] refactor: simplify interface of NavcordStepper --- src/router/navcord.rs | 51 +++++++++++------------------------------ src/router/navcorder.rs | 8 ++----- src/router/router.rs | 10 ++------ 3 files changed, 17 insertions(+), 52 deletions(-) diff --git a/src/router/navcord.rs b/src/router/navcord.rs index 93188ae..4986508 100644 --- a/src/router/navcord.rs +++ b/src/router/navcord.rs @@ -7,7 +7,6 @@ use petgraph::data::DataMap; use crate::{ drawing::{ - bend::LooseBendIndex, dot::FixedDotIndex, head::{BareHead, CaneHead, Head}, rules::AccessRules, @@ -67,54 +66,29 @@ impl NavcordStepper { match around_node_weight.node { BinavvertexNodeIndex::FixedDot(dot) => { - self.wrap_around_fixed_dot(layout, head, dot, cw) + layout.cane_around_dot(&mut self.recorder, head, dot, cw, self.width) + } + BinavvertexNodeIndex::FixedBend(fixed_bend) => { + layout.cane_around_bend(&mut self.recorder, head, fixed_bend.into(), cw, self.width) } - BinavvertexNodeIndex::FixedBend(_fixed_bend) => todo!(), BinavvertexNodeIndex::LooseBend(loose_bend) => { - self.wrap_around_loose_bend(layout, head, loose_bend, cw) + layout.cane_around_bend(&mut self.recorder, head, loose_bend.into(), cw, self.width) } } + .map_err(NavcorderException::CannotDraw) } - fn wrap_around_fixed_dot( - &mut self, - layout: &mut Layout, - head: Head, - around: FixedDotIndex, - cw: bool, - ) -> Result { - Ok(layout.cane_around_dot(&mut self.recorder, head, around, cw, self.width)?) - } - - fn wrap_around_loose_bend( - &mut self, - layout: &mut Layout, - head: Head, - around: LooseBendIndex, - cw: bool, - ) -> Result { - Ok(layout.cane_around_bend(&mut self.recorder, head, around.into(), cw, self.width)?) - } -} - -pub struct NavcordStepContext<'a, R> { - pub layout: &'a mut Layout, - pub navmesh: &'a Navmesh, - pub to: NavvertexIndex, -} - -impl NavcordStepper { #[debug_ensures(ret.is_ok() -> matches!(self.head, Head::Cane(..)))] #[debug_ensures(ret.is_ok() -> self.path.len() == old(self.path.len() + 1))] #[debug_ensures(ret.is_err() -> self.path.len() == old(self.path.len()))] pub fn step( &mut self, - input: &mut NavcordStepContext<'_, R>, + layout: &mut Layout, + navmesh: &Navmesh, + to: NavvertexIndex, ) -> Result<(), NavcorderException> { - self.head = self - .wrap(input.layout, input.navmesh, self.head, input.to)? - .into(); - self.path.push(input.to); + self.head = self.wrap(layout, navmesh, self.head, to)?.into(); + self.path.push(to); Ok(()) } @@ -127,7 +101,8 @@ impl NavcordStepper { if let Head::Cane(head) = self.head { self.head = layout.undo_cane(&mut self.recorder, head).unwrap(); } else { - panic!(); + // "can't unwrap" + return Err(NavcorderException::CannotWrap); } self.path.pop(); diff --git a/src/router/navcorder.rs b/src/router/navcorder.rs index a5eaeb3..00ebd47 100644 --- a/src/router/navcorder.rs +++ b/src/router/navcorder.rs @@ -12,7 +12,7 @@ use crate::{ use super::{ draw::{Draw, DrawException}, - navcord::{NavcordStepContext, NavcordStepper}, + navcord::NavcordStepper, navmesh::{Navmesh, NavvertexIndex}, }; @@ -105,11 +105,7 @@ impl Navcorder for Layout { path: &[NavvertexIndex], ) -> Result<(), NavcorderException> { for (i, vertex) in path.iter().enumerate() { - if let Err(err) = navcord.step(&mut NavcordStepContext { - layout: self, - navmesh, - to: *vertex, - }) { + if let Err(err) = navcord.step(self, navmesh, *vertex) { self.undo_path(navcord, i); return Err(err); } diff --git a/src/router/router.rs b/src/router/router.rs index 28f8a89..8a604fd 100644 --- a/src/router/router.rs +++ b/src/router/router.rs @@ -28,7 +28,7 @@ use crate::{ use super::{ astar::{AstarStrategy, PathTracker}, draw::DrawException, - navcord::{NavcordStepContext, NavcordStepper}, + navcord::NavcordStepper, navcorder::{Navcorder, NavcorderException}, navmesh::{Navmesh, NavmeshEdgeReference, NavmeshError, NavvertexIndex}, route::RouteStepper, @@ -105,13 +105,7 @@ impl<'a, R: AccessRules> AstarStrategy } let prev_bihead_length = self.bihead_length(); - - let result = self.navcord.step(&mut NavcordStepContext { - layout: self.layout, - navmesh, - to: edge.target(), - }); - + let result = self.navcord.step(self.layout, navmesh, edge.target()); let probe_length = self.bihead_length() - prev_bihead_length; match result {