9 releases

new 0.10.5 Apr 24, 2024
0.10.4 Apr 15, 2024
0.10.1 Mar 29, 2024
0.9.2 Mar 2, 2024

#9 in #own

Download history 546/week @ 2024-02-29 55/week @ 2024-03-07 2/week @ 2024-03-14 98/week @ 2024-03-21 815/week @ 2024-03-28 1275/week @ 2024-04-04 1129/week @ 2024-04-11 1076/week @ 2024-04-18

4,393 downloads per month
Used in build-deftly

MIT license

85KB
677 lines

derive-deftly: An ergonomic replacement for (some) proc macros

derive-deftly allows you to write macros which are driven by Rust data structures, just like proc macro derive macros, but without having to wrestle with the proc macro system.

Stability warning

We intend to make a 1.x release of this crate fairly soon. We can't rule out breaking changes before then, but hopefully they will be minor.

We aren't planning breaking changes to the template language before 1.0.

This is the replacement for derive-adhoc. We recommend that existing derive-adhoc users upgrade to derive-deftly, at some time that is convenient.

Overview

You can write an ad-hoc template, which can speak about the fields and types in the data structure. You can also define named templates and apply them to multiple structures: effectively, you can define your own derive macro.

You don't need to make a separate proc macro crate, write to the syn and proc_macro APIs. take care to properly propagate compile errors, or, generally, do any of the things that make writing proc macros so complicated.

The template language resembles the "expander" part of a macro_rules macro, but you don't have to write the "matcher" part: derive-deftly parses the input data structure for you, and makes the pieces available via predefined expansion variables.

Further documentation is available in the doc_ module(s) and the docs for the individual proc macros.

Simple example - providing Vec containing enum variant names

use derive_deftly::{define_derive_deftly, Deftly};

define_derive_deftly! {
    ListVariants =

    impl $ttype {
        fn list_variants() -> Vec<&'static str> {
            vec![ $( stringify!( $vname ) , ) ]
        }
    }
}

#[derive(Deftly)]
#[derive_deftly(ListVariants)]
enum Enum {
    UnitVariant,
    StructVariant { a: u8, b: u16 },
    TupleVariant(u8, u16),
}

assert_eq!(
    Enum::list_variants(),
    ["UnitVariant", "StructVariant", "TupleVariant"],
);

Next steps

Why not have a look at our friendly introduction?

It will walk you through derive-deftly's most important features, with a number of worked examples,

Dependencies

~2.6–3.5MB
~68K SLoC