Files
turtle/turtle-lib-macros
dietrich c4831967be Parameter Type Validation Helper: Added
validate_parameter_type(&syn::Type):

Verifies the type is a reference (syn::Type::Reference).
Ensures the reference is mutable (type_ref.mutability.is_some()),
reporting: #[turtle_main] parameter must be a mutable reference: '&mut
TurtlePlan'.
Checks that the target type (type_ref.elem) is a path whose trailing
identifier is TurtlePlan, allowing both &mut TurtlePlan and qualified
paths like &mut turtle_lib::TurtlePlan.
Rejects other types (like value: i32 or owned t: TurtlePlan), reporting:
Integration into validate_input: Called
validate_parameter_type(&pat_type.ty)?; directly within
syn::FnArg::Typed(pat_type).

Unit Tests Added:

test_valid_qualified_type: verifies &mut turtle_lib::TurtlePlan is
accepted.
test_rejects_wrong_type: verifies value: i32 is rejected with an
informative error.
test_rejects_immutable_reference: verifies t: &TurtlePlan is rejected.
test_rejects_owned_type: verifies t: TurtlePlan is rejected.
test_rejects_wrong_reference_type: verifies t: &mut i32 is rejected.
2026-09-19 20:55:00 +02:00
..
2026-09-19 10:52:00 +02:00

turtle-lib-macros

Procedural macros for turtle-lib.

turtle_main Macro

The turtle_main macro simplifies creating turtle graphics programs by automatically setting up:

  • The Macroquad window
  • Turtle initialization
  • The main rendering loop
  • Quit handling (ESC or Q keys)

Usage

With a function parameter:

use macroquad::prelude::*;
use turtle_lib::*;

#[turtle_main("My Drawing")]
fn my_drawing(turtle: &mut TurtlePlan) {
    turtle.set_pen_color(RED);
    turtle.forward(100.0);
    turtle.right(90.0);
    turtle.forward(100.0);
}

With inline code:

use macroquad::prelude::*;
use turtle_lib::*;

#[turtle_main("My Drawing")]
fn my_drawing() {
    turtle.set_pen_color(RED);
    turtle.forward(100.0);
    turtle.right(90.0);
    turtle.forward(100.0);
}

What it does

The macro expands your code into a full Macroquad application with:

  • #[macroquad::main] attribute for window creation
  • Turtle instance creation
  • TurtleApp initialization with your commands
  • A main loop that:
    • Clears the background to WHITE
    • Updates the turtle app
    • Renders the drawing
    • Shows "Press ESC or Q to quit" message
    • Handles quit keys

Benefits

  • Less boilerplate: No need to write the same loop structure in every example
  • Consistent UI: All examples have the same quit behavior
  • Beginner-friendly: Makes turtle graphics examples more approachable
  • Focus on drawing: Your code focuses on the turtle commands, not the framework

License

Licensed under either of:

at your option.