From 043e44b7f2b9d336fabe7f1f337b0798e05133b9 Mon Sep 17 00:00:00 2001 From: Dietrich Date: Mon, 19 Dec 2022 09:43:38 +0100 Subject: [PATCH] make the movement commands accept anything into the unit --- src/builders.rs | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/builders.rs b/src/builders.rs index b7cc503..dfa5d9b 100644 --- a/src/builders.rs +++ b/src/builders.rs @@ -27,29 +27,52 @@ impl TurtlePlan { pub fn new() -> TurtlePlan { TurtlePlan { commands: vec![] } } - pub fn forward(&mut self, length: Length) { +} + +pub trait DirectionalMovement: WithCommands { + fn forward(&mut self, length: IntoDistance) -> &mut Self + where + Length: From, + { + let length: Length = length.into(); self.get_mut_commands() .push(TurtleSegment::Single(DrawElement::Draw( crate::commands::MoveCommand::Forward(length), - ))) + ))); + self } - pub fn backward(&mut self, length: Precision) { + fn backward(&mut self, length: IntoDistance) -> &mut Self + where + Length: From, + { + let length: Length = length.into(); self.get_mut_commands() .push(TurtleSegment::Single(DrawElement::Draw( - crate::commands::MoveCommand::Backward(Length(length)), - ))) + crate::commands::MoveCommand::Backward(length), + ))); + self } } +impl DirectionalMovement for TurtlePlan {} + pub trait Turnable: WithCommands { - fn right(&mut self, angle: Angle) -> &mut Self { + fn right(&mut self, angle: IntoAngle) -> &mut Self + where + Angle: From, + { + let angle: Angle = angle.into(); self.get_mut_commands() .push(TurtleSegment::Single(DrawElement::Orient( crate::commands::OrientationCommand::Right(angle), ))); self } - fn left(&mut self, angle: Angle) -> &mut Self { + fn left(&mut self, angle: IntoAngle) -> &mut Self + where + Angle: From, + { + let angle: Angle = angle.into(); self.get_mut_commands() .push(TurtleSegment::Single(DrawElement::Orient( crate::commands::OrientationCommand::Left(angle),