abstract-bits-derive 0.2.0

Turn bit & byte sequences into normal structs
Documentation
use proc_macro2::{Literal, TokenStream};
use quote::quote_spanned;

use crate::codegen::list_len_ident;
use crate::model::NormalField;

pub(crate) fn write(inner_type: &NormalField) -> TokenStream {
    let field_ident = &inner_type.ident;
    quote_spanned! {field_ident.span()=>
        for element in &self.#field_ident {
            ::abstract_bits::AbstractBits::write_abstract_bits(element, writer)?;
        }
    }
}

pub(crate) fn read(field: &NormalField, struct_name: &Literal) -> TokenStream {
    let field_name = Literal::string(&field.ident.to_string());
    let len_ident = list_len_ident(&field.ident);
    let field_ident = &field.ident;
    quote_spanned! {field.ident.span()=>
        let res = (0..#len_ident).into_iter().map(|_|
            ::abstract_bits::AbstractBits::read_abstract_bits(reader)
        )
            .collect::<Result<_, ::abstract_bits::FromBytesError>>()
            .map_err(|cause| cause.read_list(#struct_name, 
                    #field_name, #len_ident as usize));
        let #field_ident = res?;
    }
}

pub(crate) fn min_bits(inner_type: &NormalField) -> TokenStream {
    quote_spanned! {inner_type.ident.span()=>
        0
    }
}

pub(crate) fn max_bits(inner_type: &NormalField, max_len: usize) -> TokenStream {
    let ty = &inner_type.out_ty;
    quote_spanned! {inner_type.ident.span()=>
        #max_len * <#ty as ::abstract_bits::AbstractBits>::MAX_BITS
    }
}