Skip to main content

gtether_derive/
lib.rs

1use proc_macro::TokenStream;
2use proc_macro_crate::{crate_name, FoundCrate};
3use syn::{parse_macro_input, DeriveInput, Error};
4
5use crate::net::driver::TestNetDriverClientServer;
6
7mod net;
8
9#[proc_macro_derive(MessageBody, attributes(message_flag, message_reply))]
10pub fn derive_message_body(input: TokenStream) -> TokenStream {
11    let ast = parse_macro_input!(input as DeriveInput);
12    let crate_ident = crate_ident();
13
14    net::message::derive_message_body(&crate_ident, ast)
15        .unwrap_or_else(Error::into_compile_error)
16        .into()
17}
18
19#[proc_macro]
20pub fn test_net_driver_client_server_core(input: TokenStream) -> TokenStream {
21    let ast = parse_macro_input!(input as TestNetDriverClientServer);
22    let crate_ident = crate_ident();
23
24    ast.gen_core_tests(&crate_ident)
25        .unwrap_or_else(Error::into_compile_error)
26        .into()
27}
28
29#[proc_macro]
30pub fn test_net_driver_client_server_send(input: TokenStream) -> TokenStream {
31    let ast = parse_macro_input!(input as TestNetDriverClientServer);
32    let crate_ident = crate_ident();
33
34    ast.gen_send_tests(&crate_ident)
35        .unwrap_or_else(Error::into_compile_error)
36        .into()
37}
38
39#[proc_macro]
40pub fn test_net_driver_client_server_send_to(input: TokenStream) -> TokenStream {
41    let ast = parse_macro_input!(input as TestNetDriverClientServer);
42    let crate_ident = crate_ident();
43
44    ast.gen_send_to_tests(&crate_ident)
45        .unwrap_or_else(Error::into_compile_error)
46        .into()
47}
48
49#[proc_macro]
50pub fn test_net_driver_client_server_broadcast(input: TokenStream) -> TokenStream {
51    let ast = parse_macro_input!(input as TestNetDriverClientServer);
52    let crate_ident = crate_ident();
53
54    ast.gen_broadcast_tests(&crate_ident)
55        .unwrap_or_else(Error::into_compile_error)
56        .into()
57}
58
59fn crate_ident() -> syn::Ident {
60    let found_crate = crate_name("gtether").unwrap();
61    let name = match &found_crate {
62        FoundCrate::Itself => "gtether",
63        FoundCrate::Name(name) => name,
64    };
65
66    syn::Ident::new(name, proc_macro2::Span::call_site())
67}