1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#[macro_use] extern crate proc_macro_hack; #[macro_use] extern crate quote; extern crate guid_parser; extern crate chomp; extern crate syn; use guid_parser::chunks; use chomp::parse_only; use syn::{Expr, ExprLit, Lit}; proc_macro_expr_impl! { pub fn guid_parts_impl(input: &str) -> String { let expr = syn::parse_str::<Expr>(input).unwrap(); if let &Expr::Lit(ExprLit { lit: Lit::Str(ref lit), .. }) = &expr { let parts = parse_only(chunks, lit.value().as_bytes()).unwrap().to_parts(); let data1: u32 = parts.0; let data2: u16 = parts.1; let data3: u16 = parts.2; let data4_0: u8 = parts.3[0]; let data4_1: u8 = parts.3[1]; let data4_2: u8 = parts.3[2]; let data4_3: u8 = parts.3[3]; let data4_4: u8 = parts.3[4]; let data4_5: u8 = parts.3[5]; let data4_6: u8 = parts.3[6]; let data4_7: u8 = parts.3[7]; (quote! { (#data1 as u32, #data2 as u16, #data3 as u16, [ #data4_0 as u8, #data4_1 as u8, #data4_2 as u8, #data4_3 as u8, #data4_4 as u8, #data4_5 as u8, #data4_6 as u8, #data4_7 as u8 ]) }).to_string() } else { panic!("illegal guid expr (expected string literal)"); } } } #[cfg(test)] mod tests { #[test] fn it_works() { } }