derive_fn

Crates.ioderive_fn
lib.rsderive_fn
version0.1.2
created_at2025-08-07 20:42:21.205821+00
updated_at2025-08-08 08:33:37.716646+00
descriptionMacro to implement all three Fn traits
homepage
repositoryhttps://github.com/Pale-Vessel/fn_macro
max_upload_size
id1785805
size8,084
Vessel (Pale-Vessel)

documentation

README

Macro for function traits

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.

Usage

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
}

Known issues

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.

Commit count: 0

cargo fmt