lambda-router-macros 0.1.2

Macros for use within lambda-router crate
Documentation
use proc_macro2::Span;
use quote::{ToTokens, TokenStreamExt};
use syn::{
    parse::{Parse, ParseStream},
    Error, Ident, Result,
};

#[derive(Debug)]
pub enum MethodType {
    Get,
    Post,
    Put,
    Delete,
}

#[derive(Debug)]
pub struct Method {
    method_type: MethodType,
    span: Span,
}

impl Parse for Method {
    fn parse(input: ParseStream) -> Result<Self> {
        let method_ident: Ident = input.parse()?;
        let span = method_ident.span();

        let method_type = match method_ident.to_string().as_str() {
            "GET" => MethodType::Get,
            "POST" => MethodType::Post,
            "PUT" => MethodType::Put,
            "DELETE" => MethodType::Delete,
            _ => {
                return Err(Error::new(
                    method_ident.span(),
                    "invalid method. only GET, POST, PUT, DELETE are supported.",
                ));
            }
        };

        Ok(Self { method_type, span })
    }
}

impl ToTokens for Method {
    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
        let upper = match self.method_type {
            MethodType::Get => "GET",
            MethodType::Post => "POST",
            MethodType::Put => "PUT",
            MethodType::Delete => "DELETE",
        };

        let ident = Ident::new(upper, self.span);

        tokens.append(ident);
    }
}