Skip to main content

le_stream_derive/
lib.rs

1//! Derive macros for the `FromLeStream` and `ToLeStream` traits.
2
3use from_le_stream::from_le_stream;
4use proc_macro2::Ident;
5use syn::{DeriveInput, GenericParam, Generics, TypeParamBound};
6use to_le_stream::to_le_stream;
7
8mod from_le_stream;
9mod to_le_stream;
10
11/// Derive the `FromLeStream` trait for a struct.
12#[proc_macro_derive(FromLeStream)]
13pub fn derive_from_le_stream(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
14    from_le_stream(input)
15}
16
17/// Derive the `ToLeStream` trait for a struct.
18#[proc_macro_derive(ToLeStream)]
19pub fn derive_to_le_stream(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
20    to_le_stream(input)
21}
22
23fn add_trait_bounds(mut generics: Generics, trait_name: &TypeParamBound) -> Generics {
24    for param in &mut generics.params {
25        if let GenericParam::Type(ref mut type_param) = *param {
26            type_param.bounds.push(trait_name.clone());
27        }
28    }
29    generics
30}
31
32fn get_repr_type(input: &DeriveInput) -> Option<Ident> {
33    input
34        .attrs
35        .iter()
36        .filter(|attr| attr.path().is_ident("repr"))
37        .find_map(|attr| attr.parse_args().ok())
38}