nade is a attribute macro that adds named and default
arguments to Rust functions.
Usage
use nade;
]
b: u32,
/// Default value of u32
c: u32,
d: u32,
)
assert_eq!; // foo(1, 2, 3, 4)
assert_eq!; // foo(42, one(), Default::default(), 2)
assert_eq!; // foo(1, 3, 2, 4)
How it works
If you write a function like this:
] b: u32, c: u32, d: u32)
it will be expanded to:
The attribute macro #[macro_v(pub)] make the visibility of the declarative
macro the same as the function. When the visibility of the function is
pub(crate), #[macro_v(pub(crate))] is also generated.
see macro-v for details.
Then, when you call the macro foo like this:
foo!;
it will be expanded to:
foo;
Limitations
- When you call the macro
foo, you must use theusestatement to bring the macro into scope, like this:
use foo;
foo!;
Because the attribute macro nade will generate a macro and a mod with
the same name as the function, and the macro use the function and the mod,
so you must use the use statement to bring the macro, the function and the
mod into scope.
- The default argument expression must be declared in the scope of the macro call.
Because default argument expression is expanded to the macro call site, so it must be declared in the scope of the macro call.
How to bypass the limitations
- You can pass a module path starting with
$crate::for thenadeattribute macro on the function, like this:
]
b: u32,
c: u32,
d: u32
)
it will be expanded to:
Then, you can not use the use statement to bring the macro into scope,
like this:
foo!;
- In the
nadeattribute macro on the parameter, you can specify the default argument expression using the full path, either$crate::a::expr, or::a::b::expr. In fact, when you use#[nade]on an parameter, you are using#[nade(::core::default::Default::default())], like this:
pub static PATH: &str = "a";
]
a: T1,
b: T2,
c: T3,
d: T4
)
Credits
This crate is inspired by these crates: