toolkit_contract_macros/
lib.rs1#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
2
3use proc_macro::TokenStream;
4use syn::parse_macro_input;
5
6mod codegen;
7mod consumes;
8mod contract_error;
9mod grpc_contract;
10mod grpc_contract_parse;
11mod model;
12mod parse;
13mod projection;
14mod proto_bridge;
15mod provides;
16mod query_params;
17mod rest_contract;
18mod rest_contract_parse;
19mod support;
20
21#[proc_macro_attribute]
22pub fn contract(attr: TokenStream, item: TokenStream) -> TokenStream {
23 let contract_attr = parse_macro_input!(attr as parse::ContractAttr);
24 let item_trait = parse_macro_input!(item as syn::ItemTrait);
25
26 match parse::parse_trait(contract_attr, &item_trait) {
27 Ok(model) => codegen::generate(&model).into(),
28 Err(err) => err.to_compile_error().into(),
29 }
30}
31
32#[proc_macro_attribute]
33pub fn rest_contract(attr: TokenStream, item: TokenStream) -> TokenStream {
34 let attr = parse_macro_input!(attr as rest_contract_parse::RestContractAttr);
35 let item = parse_macro_input!(item as syn::ItemTrait);
36
37 match rest_contract_parse::parse(attr, item) {
38 Ok(model) => rest_contract::generate(&model).into(),
39 Err(err) => err.to_compile_error().into(),
40 }
41}
42
43#[proc_macro_attribute]
44pub fn grpc_contract(attr: TokenStream, item: TokenStream) -> TokenStream {
45 let attr = parse_macro_input!(attr as grpc_contract_parse::GrpcContractAttr);
46 let item = parse_macro_input!(item as syn::ItemTrait);
47
48 match grpc_contract_parse::parse(attr, item) {
49 Ok(model) => grpc_contract::generate(&model).into(),
50 Err(err) => err.to_compile_error().into(),
51 }
52}
53
54#[proc_macro_attribute]
63pub fn provides(attr: TokenStream, item: TokenStream) -> TokenStream {
64 let attr = parse_macro_input!(attr as provides::ProvidesAttr);
65 let item = parse_macro_input!(item as syn::ItemStruct);
66 match provides::generate(&attr, &item) {
67 Ok(tokens) => tokens.into(),
68 Err(err) => err.to_compile_error().into(),
69 }
70}
71
72#[proc_macro_attribute]
81pub fn consumes(attr: TokenStream, item: TokenStream) -> TokenStream {
82 let attr = parse_macro_input!(attr as consumes::ConsumesAttr);
83 let item = parse_macro_input!(item as syn::ItemStruct);
84 match consumes::generate(&attr, &item) {
85 Ok(tokens) => tokens.into(),
86 Err(err) => err.to_compile_error().into(),
87 }
88}
89
90#[proc_macro_derive(ProtoBridge, attributes(proto_bridge))]
91pub fn derive_proto_bridge(input: TokenStream) -> TokenStream {
92 let input = parse_macro_input!(input as syn::DeriveInput);
93 match proto_bridge::generate(&input) {
94 Ok(tokens) => tokens.into(),
95 Err(err) => err.to_compile_error().into(),
96 }
97}
98
99#[proc_macro_derive(QueryParams)]
117pub fn derive_query_params(input: TokenStream) -> TokenStream {
118 let input = parse_macro_input!(input as syn::DeriveInput);
119 match query_params::generate(&input) {
120 Ok(tokens) => tokens.into(),
121 Err(err) => err.to_compile_error().into(),
122 }
123}
124
125#[proc_macro_derive(
146 ContractError,
147 attributes(error_code, error_domain, canonical, contract_error)
148)]
149pub fn derive_contract_error(input: TokenStream) -> TokenStream {
150 let input = parse_macro_input!(input as syn::DeriveInput);
151 match contract_error::generate(input) {
152 Ok(tokens) => tokens.into(),
153 Err(err) => err.to_compile_error().into(),
154 }
155}