fieldx_aux
Helper module for the fieldx crate and for any 3rd party crates, extending its functionality.
fieldx itself is heavily based on darling crate which simplifies development of proc-macros quite a lot. But
it also imposes some constraints on attribute arguments syntax. This crate aims at overcoming these limitations and
providing support for some kinds of attributes required to implement fieldx.
Here is a little break down of what is provided:
- support for nested arguments, i.e. those that look like
arg1("value", trigger, subarg(...)) - support for some syntax elements that are not on the
darlingcrate menu:some_type(crate::types::Foo),error(crate::error::Error, crate::error::Error::SomeProblem("with details"))[^tuple] - a set of types implementing standard
fieldxarguments like helpers, or literal values, etc.
[^tuple]: Here, the first argument of error() — Error — is an enum; SomeProblem is a variant.
Usage
Let's say we're implementing a field-level attribute foo using [darling::FromField] trait. And we want it to
take these arguments:
triggerwhich would let turn some functionality on or offactionto specify a method with special meaningcommentwith some textvisto specify if field-related code must be public and if yes then what kind ofpubwe need
A field declaration may take the following form with the attribute:
#[foo(
trigger,
action("method_name", private),
comment("Whatever we consider useful."),
vis(pub(crate))
)]
bar: usize,
For this we'd need the following declaration somewhere in our proc-macro implementation:
#derive(FromField)
#[darling(attributes(foo))]
struct FooField {
// ... skipping some darling-default fields ...
trigger: Option<FXBool>,
action: Option<FXHelper>,
comment: Option<FXString>,
vis: Option<FXSynValue<syn::Visibility>>,
}
That's all, this crate will take the burden of implementing the arguments from you!