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

            
15
extern crate proc_macro;
16
use {proc_macro::TokenStream, syn::parse_macro_input};
17

            
18
mod service;
19
mod wireformat;
20

            
21
/// Derives wire format encoding for structs
22
#[proc_macro_derive(JetStreamWireFormat)]
23
120
pub fn jetstream_wire_format(input: TokenStream) -> TokenStream {
24
120
    let input = parse_macro_input!(input as syn::DeriveInput);
25
120
    wireformat::wire_format_inner(input).into()
26
120
}
27

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