Steroids for [syn
], [quote
] and [proc_macro2
] crates.
full
Same as full
feature of [syn
] crate.
Enables support of data structures for representing the syntax tree of all valid Rust source code, including items and expressions.
proc_macro_derive
This is an example of how this library can be used to write a simplified [proc_macro_derive
] for deriving a [From
] implementations.
```rust
#
use synthez::{DataExt as _, ParseAttrs, ToTokens};
pub fn derive(input: syn::DeriveInput) -> syn::Resultforward
and on
arguments are mutually exclusive",
)),
(false, false) => Err(syn::Error::new_spanned(
input,
"either forward
or on
argument is expected",
)),
// #[from(forward)]
(true, _) => {
if !matches!(&input.data, syn::Data::Struct(_)) {
return Err(syn::Error::new_spanned(
input,
"only tuple structs can forward-derive From",
));
}
let fields = input.data.unnamed_fields()?;
if fields.len() > 1 {
return Err(syn::Error::new_spanned(
fields,
"only single-field tuple structs can forward-derive \
From",
));
}
let definition = ForwardDefinition {
ty: input.ident,
inner_ty: fields.into_iter().last().unwrap().ty,
};
Ok(quote! {
#definition
})
}
// #[from(on <type> = <func>)]
(_, true) => {
let definitions =
CustomDefinitions { ty: input.ident, funcs: attrs.custom };
Ok(quote! {
#definitions
})
}
}
}
struct Attrs {
#[parse(ident)]
forward: Option
struct ForwardDefinition { ty: syn::Ident, inner_ty: syn::Type, }
impl ForwardDefinition {
fn implfrom(&self) -> TokenStream {
let (ty, innerty) = (&self.ty, &self.innerty);
quote! {
impl
struct CustomDefinitions {
ty: syn::Ident,
funcs: HashMap
impl CustomDefinitions {
fn implfroms(&self) -> TokenStream {
let ty = &self.ty;
// We sort here for tests below not failing due to undetermined
// order only. Real implementation may omit this.
let mut sorted = self.funcs.iter().collect::
let input = syn::parsequote! {
#[derive(From)]
#[from(forward)]
struct Id(u64);
};
let output = quote! {
impl
let input = syn::parsequote! {
#[derive(From)]
#[from(on bool = Self::parsebool)]
#[from(on u8 = fromu8tomaybe)]
enum Maybe {
Yes,
No,
}
};
let output = quote! {
impl From
```
This software is subject to the terms of the Blue Oak Model License 1.0.0. If a copy of the BlueOak-1.0.0 license was not distributed with this file, You can obtain one at https://blueoakcouncil.org/license/1.0.0.