autoargs 0.1.1

A proc macro for generating argument structs with defaults
Documentation
use autoargs::{autoargs, default};

#[derive(Debug, PartialEq)]
struct Point {
    x: i32,
    y: i32,
}

fn default_point() -> Point {
    Point { x: 10, y: 20 }
}

fn default_scale() -> f64 {
    2.5
}

fn default_color() -> String {
    "blue".to_string()
}

#[autoargs]
fn draw_rectangle(
    #[default = "default_point()"]
    position: Point,
    #[default = "default_scale()"]
    scale: f64,
    #[default = "default_color()"]
    color: String,
) -> String {
    format!("Drawing rectangle at {:?} with scale {} and color {}", position, scale, color)
}

#[test]
fn test_all_defaults() {
    let result = draw_rectangle!();
    assert!(result.contains("x: 10, y: 20"));
    assert!(result.contains("scale 2.5"));
    assert!(result.contains("color blue"));
}

#[test]
fn test_custom_position() {
    let custom_pos = Point { x: 5, y: 15 };
    let result = draw_rectangle!(
        position = custom_pos,
    );
    assert!(result.contains("x: 5, y: 15"));
    assert!(result.contains("scale 2.5"));
    assert!(result.contains("color blue"));
}

#[test]
fn test_custom_scale_and_color() {
    let result = draw_rectangle!(
        scale = 3.0,
        color = "red".to_string(),
    );
    assert!(result.contains("x: 10, y: 20"));
    assert!(result.contains("scale 3"));
    assert!(result.contains("color red"));
}

#[test]
fn test_all_custom() {
    let custom_pos = Point { x: 0, y: 0 };
    let result = draw_rectangle!(
        position = custom_pos,
        scale = 1.0,
        color = "green".to_string(),
    );
    assert!(result.contains("x: 0, y: 0"));
    assert!(result.contains("scale 1"));
    assert!(result.contains("color green"));
}