1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
use std::collections::HashSet; use proc_macro2::TokenStream; use syn::spanned::Spanned; use syn::{DeriveInput, Path}; use quote::{quote, quote_spanned}; use crate::args::Flag; use crate::gen_caster::generate_caster; pub fn process(flags: &HashSet<Flag>, paths: Vec<Path>, input: DeriveInput) -> TokenStream { let DeriveInput { ref ident, ref generics, .. } = input; let generated = if generics.lt_token.is_some() { quote_spanned! { generics.span() => compile_error!("#[cast_to(..)] can't be used on a generic type definition"); } } else { paths .into_iter() .flat_map(|t| generate_caster(ident, &t, flags.contains(&Flag::Sync))) .collect() }; quote! { #input #generated } }