refactor: make `Step`'s error an associated type

This was suggested in https://codeberg.org/topola/topola/pulls/79.
This commit is contained in:
Mikolaj Wielgus 2024-10-12 00:38:50 +02:00
parent 0d6a0237a9
commit a9e42eef17
8 changed files with 30 additions and 18 deletions

View File

@ -87,9 +87,9 @@ impl AutorouteExecutionStepper {
} }
} }
impl<M: AccessMesadata> Step<Autorouter<M>, AutorouteStatus, AutorouterError, ()> impl<M: AccessMesadata> Step<Autorouter<M>, AutorouteStatus, ()> for AutorouteExecutionStepper {
for AutorouteExecutionStepper type Error = AutorouterError;
{
fn step(&mut self, autorouter: &mut Autorouter<M>) -> Result<AutorouteStatus, AutorouterError> { fn step(&mut self, autorouter: &mut Autorouter<M>) -> Result<AutorouteStatus, AutorouterError> {
let Some(curr_ratline) = self.curr_ratline else { let Some(curr_ratline) = self.curr_ratline else {
return Ok(AutorouteStatus::Finished); return Ok(AutorouteStatus::Finished);

View File

@ -66,9 +66,11 @@ impl CompareDetoursExecutionStepper {
// XXX: Do we really need this to be a stepper? We don't use at the moment, as sorting functions // XXX: Do we really need this to be a stepper? We don't use at the moment, as sorting functions
// aren't steppable either. It may be useful for debugging later on tho. // aren't steppable either. It may be useful for debugging later on tho.
impl<M: AccessMesadata> Step<Autorouter<M>, CompareDetoursStatus, AutorouterError, (f64, f64)> impl<M: AccessMesadata> Step<Autorouter<M>, CompareDetoursStatus, (f64, f64)>
for CompareDetoursExecutionStepper for CompareDetoursExecutionStepper
{ {
type Error = AutorouterError;
fn step( fn step(
&mut self, &mut self,
autorouter: &mut Autorouter<M>, autorouter: &mut Autorouter<M>,

View File

@ -74,7 +74,9 @@ impl ExecutionStepper {
} }
} }
impl<M: AccessMesadata> Step<Invoker<M>, InvokerStatus, InvokerError, ()> for ExecutionStepper { impl<M: AccessMesadata> Step<Invoker<M>, InvokerStatus, ()> for ExecutionStepper {
type Error = InvokerError;
fn step(&mut self, invoker: &mut Invoker<M>) -> Result<InvokerStatus, InvokerError> { fn step(&mut self, invoker: &mut Invoker<M>) -> Result<InvokerStatus, InvokerError> {
match self.step_catch_err(&mut invoker.autorouter) { match self.step_catch_err(&mut invoker.autorouter) {
Ok(InvokerStatus::Running) => Ok(InvokerStatus::Running), Ok(InvokerStatus::Running) => Ok(InvokerStatus::Running),

View File

@ -70,9 +70,9 @@ pub enum ActivityStepper {
Execution(ExecutionStepper), Execution(ExecutionStepper),
} }
impl<M: AccessMesadata> Step<ActivityContext<'_, M>, ActivityStatus, ActivityError, ()> impl<M: AccessMesadata> Step<ActivityContext<'_, M>, ActivityStatus, ()> for ActivityStepper {
for ActivityStepper type Error = ActivityError;
{
fn step(&mut self, context: &mut ActivityContext<M>) -> Result<ActivityStatus, ActivityError> { fn step(&mut self, context: &mut ActivityContext<M>) -> Result<ActivityStatus, ActivityError> {
match self { match self {
ActivityStepper::Interaction(interaction) => { ActivityStepper::Interaction(interaction) => {
@ -152,9 +152,11 @@ impl ActivityStepperWithStatus {
} }
} }
impl<M: AccessMesadata> Step<ActivityContext<'_, M>, ActivityStatus, ActivityError, ()> impl<M: AccessMesadata> Step<ActivityContext<'_, M>, ActivityStatus, ()>
for ActivityStepperWithStatus for ActivityStepperWithStatus
{ {
type Error = ActivityError;
fn step(&mut self, context: &mut ActivityContext<M>) -> Result<ActivityStatus, ActivityError> { fn step(&mut self, context: &mut ActivityContext<M>) -> Result<ActivityStatus, ActivityError> {
let status = self.activity.step(context)?; let status = self.activity.step(context)?;
self.maybe_status = Some(status.clone()); self.maybe_status = Some(status.clone());

View File

@ -42,7 +42,9 @@ pub enum InteractionStepper {
// - interactively moving a footprint. // - interactively moving a footprint.
} }
impl Step<InteractionContext, InteractionStatus, InteractionError, ()> for InteractionStepper { impl Step<InteractionContext, InteractionStatus, ()> for InteractionStepper {
type Error = InteractionError;
fn step( fn step(
&mut self, &mut self,
context: &mut InteractionContext, context: &mut InteractionContext,

View File

@ -203,14 +203,16 @@ where
} }
} }
impl<G, K, R, S: AstarStrategy<G, K, R>> impl<G, K, R, S: AstarStrategy<G, K, R>> Step<S, AstarStatus<G, K, R>, (K, Vec<G::NodeId>, R)>
Step<S, AstarStatus<G, K, R>, AstarError, (K, Vec<G::NodeId>, R)> for Astar<G, K> for Astar<G, K>
where where
G: GraphBase, G: GraphBase,
G::NodeId: Eq + Hash, G::NodeId: Eq + Hash,
for<'a> &'a G: IntoEdges<NodeId = G::NodeId, EdgeId = G::EdgeId> + MakeEdgeRef, for<'a> &'a G: IntoEdges<NodeId = G::NodeId, EdgeId = G::EdgeId> + MakeEdgeRef,
K: Measure + Copy, K: Measure + Copy,
{ {
type Error = AstarError;
fn step(&mut self, strategy: &mut S) -> Result<AstarStatus<G, K, R>, AstarError> { fn step(&mut self, strategy: &mut S) -> Result<AstarStatus<G, K, R>, AstarError> {
if let Some(curr_node) = self.maybe_curr_node { if let Some(curr_node) = self.maybe_curr_node {
if self.is_probing { if self.is_probing {

View File

@ -73,9 +73,9 @@ impl RouteStepper {
} }
} }
impl<'a, R: AccessRules> Step<Router<'a, R>, RouterStatus, AstarError, BandTermsegIndex> impl<'a, R: AccessRules> Step<Router<'a, R>, RouterStatus, BandTermsegIndex> for RouteStepper {
for RouteStepper type Error = AstarError;
{
fn step(&mut self, router: &mut Router<R>) -> Result<RouterStatus, AstarError> { fn step(&mut self, router: &mut Router<R>) -> Result<RouterStatus, AstarError> {
let navcorder = Navcorder::new(router.layout_mut()); let navcorder = Navcorder::new(router.layout_mut());
let target = self.astar.graph.destination(); let target = self.astar.graph.destination();

View File

@ -1,7 +1,9 @@
pub trait Step<C, S: TryInto<O>, E, O> { pub trait Step<C, S: TryInto<O>, O> {
fn step(&mut self, context: &mut C) -> Result<S, E>; type Error;
fn finish(&mut self, context: &mut C) -> Result<O, E> { fn step(&mut self, context: &mut C) -> Result<S, Self::Error>;
fn finish(&mut self, context: &mut C) -> Result<O, Self::Error> {
loop { loop {
if let Ok(outcome) = self.step(context)?.try_into() { if let Ok(outcome) = self.step(context)?.try_into() {
return Ok(outcome); return Ok(outcome);