lambda_router_macros/router_macro/
method.rs1use 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}