compile_time_crc32_impl/
lib.rs1extern 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}