compile_time_crc32_impl/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use proc_macro_hack::proc_macro_hack;
5use quote::{quote, quote_spanned};
6use syn::{parse_macro_input, Lit, spanned::Spanned};
7
8fn lit_to_bytes(lit: &Lit) -> Option<Vec<u8>> {
9    match lit {
10        Lit::Str(lit_str) => {
11            Some(lit_str.value().into_bytes())
12        }
13        Lit::ByteStr(lit_str) => {
14            Some(lit_str.value())
15        }
16        _ => {
17            None
18        }
19    }
20}
21
22#[proc_macro_hack]
23pub fn crc32(input: TokenStream) -> TokenStream {
24    let expr = parse_macro_input!(input as Lit);
25
26    match lit_to_bytes(&expr) {
27        Some(bytes) => {
28            let crc = crc::crc32::checksum_ieee(&bytes);
29            
30            TokenStream::from(quote! {
31                (#crc)
32            })
33        }
34        None => {
35            let span = expr.span();
36            TokenStream::from(quote_spanned!{span =>
37                compile_error!("Invalid literal");
38            })
39        }
40    }
41    
42}