1
#![doc(
2
    html_logo_url = "https://raw.githubusercontent.com/sevki/jetstream/main/logo/JetStream.png"
3
)]
4
#![doc(
5
    html_favicon_url = "https://raw.githubusercontent.com/sevki/jetstream/main/logo/JetStream.png"
6
)]
7
//! # JetStream Derive
8
//! This crate provides macros for JetStream.
9
//! ## `service`
10
//! The `service` macro is used to define a JetStream service.
11
//!
12
//! ## `JetStreamWireFormat`
13
//! The `JetStreamWireFormat` macro is used to derive the `WireFormat` trait for a struct.
14
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
15
#![recursion_limit = "256"]
16

            
17
extern crate proc_macro;
18
use proc_macro::TokenStream;
19
use syn::parse_macro_input;
20

            
21
mod service;
22
mod wireformat;
23
#[cfg(test)]
24
mod tests;
25

            
26
/// Derives wire format encoding for structs
27
#[proc_macro_derive(JetStreamWireFormat, attributes(jetstream))]
28
130
pub fn jetstream_wire_format(input: TokenStream) -> TokenStream {
29
130
    let input = parse_macro_input!(input as syn::DeriveInput);
30
130
    wireformat::wire_format_inner(input).into()
31
130
}
32

            
33
/// Service attribute macro for creating RPC services
34
#[proc_macro_attribute]
35
6
pub fn service(attr: TokenStream, item: TokenStream) -> TokenStream {
36
6
    let is_async_trait =
37
6
        !attr.is_empty() && attr.to_string().contains("async_trait");
38
6
    let item = parse_macro_input!(item as syn::ItemTrait);
39
6
    service::service_impl(item, is_async_trait).into()
40
6
}