rust_cef_derive/
lib.rs

1/// This crate provides macros to generate boiler-plate CEF-trait code
2/// to provide fixed values, inherit values and bubble them up to a larger item
3/// or to convert fields/variants into header values.
4///
5/// It also allows anotating fields to have specific names in CEF extensions.
6///
7extern crate proc_macro;
8extern crate proc_macro2;
9
10use quote::quote;
11
12mod cef_extensions_trait;
13mod cef_header_traits;
14mod helpers;
15
16use crate::proc_macro::TokenStream;
17use cef_extensions_trait::implement_extensions_trait;
18use cef_header_traits::implement_header_trait;
19use std::convert::From;
20use syn::{parse_macro_input, DeriveInput};
21
22/// This macro derives the ToCef trait on the annotated item.
23/// For now, the ToCef trait itself provides a useful implementation
24/// of the trait, so this macro simply implements a blank trait.
25///
26#[proc_macro_derive(ToCef)]
27pub fn derive_to_cef(input: TokenStream) -> TokenStream {
28    let input = parse_macro_input!(input as DeriveInput);
29
30    // type name
31    let name = &input.ident;
32
33    // generics
34    let generics = input.generics;
35    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
36
37    // default implementation is great
38    let to_cef_impl = quote! {
39        impl #impl_generics rust_cef::ToCef for #name #ty_generics #where_clause {}
40    };
41
42    TokenStream::from(to_cef_impl)
43}
44
45#[proc_macro_derive(CefHeaderVersion, attributes(cef_values, cef_inherit, cef_field))]
46pub fn derive_cef_header_version(item_tokens: TokenStream) -> TokenStream {
47    implement_header_trait("CefHeaderVersion", item_tokens)
48}
49
50#[proc_macro_derive(CefHeaderDeviceVendor, attributes(cef_values, cef_inherit, cef_field))]
51pub fn derive_cef_header_device_vendor(item_tokens: TokenStream) -> TokenStream {
52    implement_header_trait("CefHeaderDeviceVendor", item_tokens)
53}
54
55#[proc_macro_derive(CefHeaderDeviceProduct, attributes(cef_values, cef_inherit, cef_field))]
56pub fn derive_cef_header_device_product(item_tokens: TokenStream) -> TokenStream {
57    implement_header_trait("CefHeaderDeviceProduct", item_tokens)
58}
59
60#[proc_macro_derive(CefHeaderDeviceVersion, attributes(cef_values, cef_inherit, cef_field))]
61pub fn derive_cef_header_device_version(item_tokens: TokenStream) -> TokenStream {
62    implement_header_trait("CefHeaderDeviceVersion", item_tokens)
63}
64#[proc_macro_derive(
65    CefHeaderDeviceEventClassID,
66    attributes(cef_values, cef_inherit, cef_field)
67)]
68pub fn derive_cef_header_device_event_class_id(item_tokens: TokenStream) -> TokenStream {
69    implement_header_trait("CefHeaderDeviceEventClassID", item_tokens)
70}
71#[proc_macro_derive(CefHeaderName, attributes(cef_values, cef_inherit, cef_field))]
72pub fn derive_cef_header_name(item_tokens: TokenStream) -> TokenStream {
73    implement_header_trait("CefHeaderName", item_tokens)
74}
75#[proc_macro_derive(CefHeaderSeverity, attributes(cef_values, cef_inherit, cef_field))]
76pub fn derive_cef_header_severity(item_tokens: TokenStream) -> TokenStream {
77    implement_header_trait("CefHeaderSeverity", item_tokens)
78}
79
80#[proc_macro_derive(
81    CefExtensions,
82    attributes(cef_ext_field, cef_ext_gobble, cef_ext_values)
83)]
84pub fn derive_cef_extensions(input: TokenStream) -> TokenStream {
85    implement_extensions_trait(input)
86}