| Crates.io | derive_fn |
| lib.rs | derive_fn |
| version | 0.1.2 |
| created_at | 2025-08-07 20:42:21.205821+00 |
| updated_at | 2025-08-08 08:33:37.716646+00 |
| description | Macro to implement all three Fn traits |
| homepage | |
| repository | https://github.com/Pale-Vessel/fn_macro |
| max_upload_size | |
| id | 1785805 |
| size | 8,084 |
This crate adds a macro to derive the three function traits FnOnce, FnMut, and Fn. These traits are often implemented three times with the same signature and body (excluding the different borrow type on self), which can lead to unnecessary boilerplate - this macro hopes to overcome this.
This macro is comprised of four parts - the initial derive, and three attributes for the input and output types, and the function body.
[dependencies]
fn_macro = "0.1.0"
#![feature(unboxed_closures)]
#![feature(fn_traits)]
use fn_macro::{Fn, fn_args, fn_body, fn_output};
#[derive(Fn)]
#[fn_args(f64, f64, String)]
#[fn_body{
let k = self.0 + args.0;
format!("{} {}", args.2, k + args.1)
}]
#[fn_output(String)]
struct Test(f64);
fn main() {
let object = Test(9.5);
println!("{}", object(1.0, 2.5, String::from("Hello"))) //Hello 13.0
}
Due to the use of expect in the macro code, VSCode will highlight the macro's use as incorrect code, claiming it will always panic. This is wrong - the macro will only panic if one of the necessary fields is not provided.