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),