datalit-macros-internals 0.1.0-alpha.4

Internals for the datalit crate
Documentation
#![doc(hidden)]
#![forbid(unsafe_code)]

use proc_macro2::{Span, TokenStream};

use crate::state::StateOperation as _;
use quote::quote;

mod entry;
mod parse;
mod state;
mod to_bytes;

pub fn generate_data(input: TokenStream) -> syn::Result<Vec<u8>> {
    let entries: entry::SequenceEntry = syn::parse2(input)?;

    let mut state = state::EntryState::new();
    entries.apply_to(&mut state)?;
    state.check()?;
    state.generate_data()
}

pub fn generate_expr(input: TokenStream) -> syn::Result<TokenStream> {
    let byte_array = generate_data(input)?
        .into_iter()
        .map(|b| syn::LitByte::new(b, Span::call_site()));
    Ok(quote! {{
        let __slice: &'static [u8] = &[
            #(#byte_array),*
        ];
        __slice
    }})
}

pub fn generate_expr_raw(input: TokenStream) -> TokenStream {
    generate_expr(input).unwrap_or_else(|e| {
        let errors = e.into_iter().map(syn::Error::into_compile_error);
        quote! {{#(#errors);*}}
    })
}