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