binary_options_tools_macros/
lib.rs

1mod action;
2mod config;
3mod deserialize;
4mod impls;
5mod region;
6mod serialize;
7mod timeout;
8
9use action::ActionImpl;
10use config::Config;
11use deserialize::Deserializer;
12use region::RegionImpl;
13use timeout::{Timeout, TimeoutArgs, TimeoutBody};
14
15use darling::FromDeriveInput;
16use proc_macro::TokenStream;
17use quote::quote;
18use serialize::Serializer;
19use syn::{parse_macro_input, DeriveInput};
20
21#[proc_macro]
22pub fn deserialize(input: TokenStream) -> TokenStream {
23    let d = parse_macro_input!(input as Deserializer);
24    quote! { #d }.into()
25}
26
27#[proc_macro]
28pub fn serialize(input: TokenStream) -> TokenStream {
29    let s = parse_macro_input!(input as Serializer);
30    quote! { #s }.into()
31}
32
33/// This macro wraps any async function and transforms it's output `T` into `anyhow::Result<T>`,
34/// if the function doesn't end before the timout it will rais an error
35/// The macro also supports creating a `#[tracing::instrument]` macro with all the params inside `tracing(args)`
36/// Example:
37///     #[timeout(10, tracing(skip(non_debug_input)))]
38///     #[timeout(12)]
39#[proc_macro_attribute]
40pub fn timeout(attr: TokenStream, item: TokenStream) -> TokenStream {
41    let args = parse_macro_input!(attr as TimeoutArgs);
42    let body = parse_macro_input!(item as TimeoutBody);
43    let timeout = Timeout::new(body, args);
44    let q = quote! { #timeout };
45
46    // println!("{q}");
47    q.into()
48}
49
50#[proc_macro_derive(Config, attributes(config))]
51pub fn config(input: TokenStream) -> TokenStream {
52    let parsed = parse_macro_input!(input as DeriveInput);
53    let config = Config::from_derive_input(&parsed).unwrap();
54    quote! { #config }.into()
55}
56
57#[proc_macro_derive(RegionImpl, attributes(region))]
58pub fn region(input: TokenStream) -> TokenStream {
59    let parsed = parse_macro_input!(input as DeriveInput);
60    let region = RegionImpl::from_derive_input(&parsed).unwrap();
61    quote! { #region }.into()
62}
63
64#[proc_macro_derive(ActionImpl, attributes(action))]
65pub fn action_impl(input: TokenStream) -> TokenStream {
66    let parsed = parse_macro_input!(input as DeriveInput);
67    let action = match ActionImpl::from_derive_input(&parsed) {
68        Ok(action) => action,
69        Err(e) => return e.write_errors().into(),
70    };
71    quote! {
72        #action
73    }
74    .into()
75}