1mod enum_info;
7mod field_info;
8mod fragments;
9mod parse;
10mod record_info;
11mod struct_info;
12mod tag_type_info;
13mod trait_impl;
14mod unpack_error_info;
15mod unpack_visitor_info;
16mod variant_info;
17
18use proc_macro::TokenStream;
19use proc_macro2::Span;
20use proc_macro_crate::{crate_name, FoundCrate};
21use quote::ToTokens;
22use syn::{parse_macro_input, Ident};
23
24use self::trait_impl::TraitImpl;
25
26#[proc_macro_derive(Packable, attributes(packable))]
27pub fn packable(input: TokenStream) -> TokenStream {
28 let input = parse_macro_input!(input);
29
30 let crate_string = match crate_name("packable").expect("packable should be present in `Cargo.toml`") {
31 FoundCrate::Itself => "packable_crate".to_owned(),
32 FoundCrate::Name(name) => name,
33 };
34
35 match TraitImpl::new(input, Ident::new(&crate_string, Span::call_site())) {
36 Ok(trait_impl) => trait_impl.into_token_stream(),
37 Err(err) => err.into_compile_error(),
38 }
39 .into()
40}