lambda_router_macros/router_macro/
method.rs

1use proc_macro2::Span;
2use quote::{ToTokens, TokenStreamExt};
3use syn::{
4    parse::{Parse, ParseStream},
5    Error, Ident, Result,
6};
7
8#[derive(Debug)]
9pub enum MethodType {
10    Get,
11    Post,
12    Put,
13    Delete,
14}
15
16#[derive(Debug)]
17pub struct Method {
18    method_type: MethodType,
19    span: Span,
20}
21
22impl Parse for Method {
23    fn parse(input: ParseStream) -> Result<Self> {
24        let method_ident: Ident = input.parse()?;
25        let span = method_ident.span();
26
27        let method_type = match method_ident.to_string().as_str() {
28            "GET" => MethodType::Get,
29            "POST" => MethodType::Post,
30            "PUT" => MethodType::Put,
31            "DELETE" => MethodType::Delete,
32            _ => {
33                return Err(Error::new(
34                    method_ident.span(),
35                    "invalid method. only GET, POST, PUT, DELETE are supported.",
36                ));
37            }
38        };
39
40        Ok(Self { method_type, span })
41    }
42}
43
44impl ToTokens for Method {
45    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
46        let upper = match self.method_type {
47            MethodType::Get => "GET",
48            MethodType::Post => "POST",
49            MethodType::Put => "PUT",
50            MethodType::Delete => "DELETE",
51        };
52
53        let ident = Ident::new(upper, self.span);
54
55        tokens.append(ident);
56    }
57}