salvo_macro_ext 0.1.3

Unofficial extension macros for the salvo web framework.
Documentation
//! Unofficial extension macros for the [Salvo web framework](https://github.com/salvo-rs/salvo).

mod module;
mod utils;

use proc_macro::TokenStream;
use syn::{parse_macro_input, Item};

/// `#[module]` is an attribute macro used to batch convert methods in an `impl` block into [`Salvo`'s `Handler`](https://github.com/salvo-rs/salvo).
///
/// ## Example
/// ```
/// use salvo::oapi::extract::*;
/// use salvo::prelude::*;
/// use salvo_macro_ext::module;
///
/// #[derive(Clone)]
/// pub struct Service {
///     state: i64,
/// }
///
/// #[module]
/// impl Service {
///     fn new(state: i64) -> Self {
///         Self { state }
///     }
///     /// doc line 1
///     /// doc line 2
///     #[salvo_macro_ext::module(handler)]
///     fn add1(&self, left: QueryParam<i64, true>, right: QueryParam<i64, true>) -> String {
///         (self.state + *left + *right).to_string()
///     }
///     /// doc line 3
///     /// doc line 4
///     #[module(handler)]
///     pub(crate) fn add2(
///         self: ::std::sync::Arc<Self>,
///         left: QueryParam<i64, true>,
///         right: QueryParam<i64, true>,
///     ) -> String {
///         (self.state + *left + *right).to_string()
///     }
///     /// doc line 5
///     /// doc line 6
///     #[module(handler)]
///     pub fn add3(left: QueryParam<i64, true>, right: QueryParam<i64, true>) -> String {
///         (*left + *right).to_string()
///     }
/// }
/// ```
/// Sure, you can also replace `#[module(handler)]` with `#[module(endpoint(...))]`.
///
/// NOTE: If the receiver of a method is `&self`, you need to implement the `Clone` trait for the type.
#[proc_macro_attribute]
pub fn module(_args: TokenStream, input: TokenStream) -> TokenStream {
    let item = parse_macro_input!(input as Item);
    match module::generate(item) {
        Ok(stream) => stream.into(),
        Err(e) => e.to_compile_error().into(),
    }
}