1use from_le_stream::from_le_stream;
4use from_le_stream_tagged::from_le_stream_tagged;
5use proc_macro2::Ident;
6use syn::{DeriveInput, GenericParam, Generics, TypeParamBound};
7use to_le_stream::to_le_stream;
8
9mod from_le_stream;
10mod from_le_stream_tagged;
11mod to_le_stream;
12
13#[proc_macro_derive(FromLeStream)]
15pub fn derive_from_le_stream(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
16 from_le_stream(input)
17}
18
19#[proc_macro_derive(FromLeStreamTagged)]
21pub fn derive_from_le_stream_tagged(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
22 from_le_stream_tagged(input)
23}
24
25#[proc_macro_derive(ToLeStream)]
27pub fn derive_to_le_stream(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
28 to_le_stream(input)
29}
30
31fn add_trait_bounds(mut generics: Generics, trait_name: &TypeParamBound) -> Generics {
32 for param in &mut generics.params {
33 if let GenericParam::Type(ref mut type_param) = *param {
34 type_param.bounds.push(trait_name.clone());
35 }
36 }
37 generics
38}
39
40fn get_repr_type(input: &DeriveInput) -> Option<Ident> {
41 input
42 .attrs
43 .iter()
44 .filter(|attr| attr.path().is_ident("repr"))
45 .find_map(|attr| attr.parse_args().ok())
46}