packable_derive/
lib.rs

1// Copyright 2023 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4//! This crate provides the `Packable` derive macro.
5
6mod 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}