open_protocol_codec_proc_macro/
lib.rs1use syn::{parse_macro_input, DeriveInput};
2use base::{Error};
3
4mod decode;
5mod encode;
6mod base;
7mod field;
8mod message;
9mod enum_items;
10mod util;
11
12extern crate proc_macro;
13
14#[proc_macro_derive(OpenProtocolEncode, attributes(open_protocol_field, open_protocol_value))]
15pub fn derive_encode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
16 let input = parse_macro_input!(input as DeriveInput);
17 let token_stream = try_expand(encode::expand(input));
18 proc_macro::TokenStream::from(token_stream)
19}
20
21#[proc_macro_derive(OpenProtocolDecode, attributes(open_protocol_field, open_protocol_value))]
22pub fn derive_decode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
23 let input = parse_macro_input!(input as DeriveInput);
24 let token_stream = try_expand(decode::expand(input));
25 proc_macro::TokenStream::from(token_stream)
26}
27
28#[proc_macro_derive(OpenProtocolMessage, attributes(open_protocol_message))]
29pub fn derive_message(msg: proc_macro::TokenStream) -> proc_macro::TokenStream {
30 let input = parse_macro_input!(msg as DeriveInput);
31 let token_stream = try_expand(message::expand(input));
32 proc_macro::TokenStream::from(token_stream)
33}
34
35
36fn try_expand(result: Result<proc_macro2::TokenStream, Error>) -> proc_macro2::TokenStream {
37 match result {
38 Ok(token_stream) => token_stream,
39 Err(Error::Syn(syn_error)) => syn_error.to_compile_error(),
40 Err(err) => panic!("Error encountered: {}", err)
41 }
42}