darling is a crate for proc macro authors, which enables parsing attributes into structs. It is heavily inspired by
serde both in its internals and in its API.
- Easy and declarative parsing of macro input - make your proc-macros highly controllable with minimal time investment.
- Great validation and errors, no work required. When users of your proc-macro make a mistake,
darlingmakes sure they get error markers at the right place in their source, and provides "did you mean" suggestions for misspelled fields.
darling provides a set of traits which can be derived or manually implemented.
FromMetais used to extract values from a meta-item in an attribute. Implementations are likely reusable for many libraries, much like
serde::Deserialize. Trait implementations are provided for primitives, some std types, and some
FromDeriveInputis implemented or derived by each proc-macro crate which depends on
darling. This is the root for input parsing; it gets access to the identity, generics, and visibility of the target type, and can specify which attribute names should be parsed or forwarded from the input AST.
FromFieldis implemented or derived by each proc-macro crate which depends on
darling. Structs deriving this trait will get access to the identity (if it exists), type, and visibility of the field.
FromVariantis implemented or derived by each proc-macro crate which depends on
darling. Structs deriving this trait will get access to the identity and contents of the variant, which can be transformed the same as any other
FromAttributesis a lower-level version of the more-specific
FromVarianttraits. Structs deriving this trait get a meta-item extractor and error collection which works for any syntax element, including traits, trait items, and functions. This is useful for non-derive proc macros.
darling::astprovides generic types for representing the AST.
darling::usageprovides traits and functions for determining where type parameters and lifetimes are used in a struct or enum.
darling::utilprovides helper types with special
FromMetaimplementations, such as
extern crate darling; extern crate syn;
The above code will then be able to parse this input:
/// A doc comment which will be available in `MyTraitOpts::attrs`. ;
Non-derive attribute macros are supported.
To parse arguments for attribute macros, derive
FromMeta on the argument receiver type, then pass
&syn::AttributeArgs to the
This will produce a normal
darling::Result<T> that can be used the same as a result from parsing a
use FromMeta; use ; use TokenStream;
Darling's features are built to work well for real-world projects.
- Defaults: Supports struct- and field-level defaults, using the same path syntax as
darling::util::Flagfields are innately optional; you don't need to declare
- Field Renaming: Fields can have different names in usage vs. the backing code.
- Auto-populated fields: Structs deriving
FromFieldcan declare properties named
genericsto automatically get copies of the matching values from the input AST.
datato get access to the body of the deriving type, and
- Mapping function: Use
#[darling(and_then="path")]to specify a function that runs on the result of parsing a meta-item field. This can change the return type, which enables you to parse to an intermediate form and convert that to the type you need in your struct.
- Skip fields: Use
#[darling(skip)]to mark a field that shouldn't be read from attribute meta-items.
- Multiple-occurrence fields: Use
Vecfield to allow that field to appear multiple times in the meta-item. Each occurrence will be pushed into the
- Span access: Use
darling::util::SpannedValuein a struct to get access to that meta item's source code span. This can be used to emit warnings that point at a specific field from your proc macro. In addition, you can use
darling::Error::write_errorsto automatically get precise error location details in most cases.
- "Did you mean" suggestions: Compile errors from derived darling trait impls include suggestions for misspelled fields.
Some proc-macros only work on structs, while others need enums whose variants are either unit or newtype variants.
Darling makes this sort of validation extremely simple.
On the receiver that derives
#[darling(supports(...))] and then list the shapes that your macro should accept.
||Accept any struct|
||Accept structs with named fields, e.g.
||Accept newtype structs, e.g.
||Accept tuple structs, e.g.
||Accept unit structs, e.g.
||Accept any enum|
||Accept enum variants with named fields|
||Accept newtype enum variants|
||Accept tuple enum variants|
||Accept unit enum variants|
Each one is additive, so listing
#[darling(supports(struct_any, enum_newtype))] would accept all structs and any enum where every variant is a newtype variant.
This can also be used when deriving
FromVariant, without the