use quote::quote;
pub fn type_to_ident(ident: &String, ty: &syn::Type) -> Result<proc_macro2::TokenStream, String> {
match ty {
syn::Type::Array(ty) => type_to_ident(ident, ty.elem.as_ref()),
syn::Type::BareFn(_ty) => Err(format!("Unhandled type ImplTrait for {}", ident)),
syn::Type::Group(ty) => type_to_ident(ident, ty.elem.as_ref()),
syn::Type::ImplTrait(_ty) => Err(format!("Unhandled type ImplTrait for {}", ident)),
syn::Type::Infer(_ty) => Err(format!("Unhandled type Infer for {}", ident)),
syn::Type::Macro(_ty) => Err(format!("Unhandled type Macro for {}", ident)),
syn::Type::Never(_ty) => Err(format!("Unhandled type Never for {}", ident)),
syn::Type::Paren(ty) => type_to_ident(ident, ty.elem.as_ref()),
syn::Type::Path(ty) => {
let ident = ty.path.segments[0].ident.to_owned();
let stream = ty.path.segments[0].arguments.to_owned();
if let syn::PathArguments::None = stream {
return Ok(quote!(#ident));
}
Ok(quote!(#ident ::#stream))
}
syn::Type::Ptr(_ty) => Err(format!("Unhandled type Ptr for {}", ident)),
syn::Type::Reference(_ty) => Err(format!("Unhandled type Reference for {}", ident)),
syn::Type::Slice(_ty) => Err(format!("Unhandled type Slice for {}", ident)),
syn::Type::TraitObject(_ty) => Err(format!("Unhandled type TraitObject for {}", ident)),
syn::Type::Tuple(_ty) => Err(format!("Unhandled type Tuple for {}", ident)),
syn::Type::Verbatim(_ty) => Err(format!("Unhandled type Verbatim for {}", ident)),
_ => Err(format!("Unknown Type for {}", ident)),
}
}
pub fn type_to_ident_unnamed(
index: usize,
ty: &syn::Type,
) -> Result<proc_macro2::TokenStream, String> {
match ty {
syn::Type::Array(ty) => type_to_ident_unnamed(index, ty.elem.as_ref()),
syn::Type::BareFn(_ty) => Err(format!("Unhandled type ImplTrait for {}", index)),
syn::Type::Group(ty) => type_to_ident_unnamed(index, ty.elem.as_ref()),
syn::Type::ImplTrait(_ty) => Err(format!("Unhandled type ImplTrait for {}", index)),
syn::Type::Infer(_ty) => Err(format!("Unhandled type Infer for {}", index)),
syn::Type::Macro(_ty) => Err(format!("Unhandled type Macro for {}", index)),
syn::Type::Never(_ty) => Err(format!("Unhandled type Never for {}", index)),
syn::Type::Paren(ty) => type_to_ident_unnamed(index, ty.elem.as_ref()),
syn::Type::Path(ty) => {
let ident = ty.path.segments[0].ident.to_owned();
let stream = ty.path.segments[0].arguments.to_owned();
if let syn::PathArguments::None = stream {
return Ok(quote!(#ident));
}
Ok(quote!(#ident ::#stream))
}
syn::Type::Ptr(_ty) => Err(format!("Unhandled type Ptr for {}", index)),
syn::Type::Reference(_ty) => Err(format!("Unhandled type Reference for {}", index)),
syn::Type::Slice(_ty) => Err(format!("Unhandled type Slice for {}", index)),
syn::Type::TraitObject(_ty) => Err(format!("Unhandled type TraitObject for {}", index)),
syn::Type::Tuple(_ty) => Err(format!("Unhandled type Tuple for {}", index)),
syn::Type::Verbatim(_ty) => Err(format!("Unhandled type Verbatim for {}", index)),
_ => Err(format!("Unknown Type for {}", index)),
}
}