1mod args;
2mod decl;
3mod imp;
4
5use args::{Args, ImplArgs, TraitArgs};
6use proc_macro::TokenStream;
7use syn::{Error, Item, Result};
8
9#[proc_macro_attribute]
10pub fn extern_trait(args: TokenStream, input: TokenStream) -> TokenStream {
11 expand(args, input)
12 .unwrap_or_else(Error::into_compile_error)
13 .into()
14}
15
16fn expand(args: TokenStream, input: TokenStream) -> Result<proc_macro2::TokenStream> {
17 let args = syn::parse::<Args>(args)?;
18
19 match syn::parse::<Item>(input)? {
20 Item::Trait(input) => decl::expand(TraitArgs::try_from(args)?, input),
21 Item::Impl(input) => imp::expand(ImplArgs::try_from(args)?, input),
22 input => Err(Error::new_spanned(
23 input,
24 "#[extern_trait] can only be used on a trait or trait impl",
25 )),
26 }
27}