interfacer_http_attribute/
lib.rs

1#![feature(proc_macro_diagnostic)]
2
3extern crate proc_macro;
4use proc_macro::TokenStream;
5use quote::quote;
6use syn::{parse_macro_input, DeriveInput, ItemTrait};
7
8#[proc_macro_attribute]
9pub fn http_service(_args: TokenStream, input: TokenStream) -> TokenStream {
10    service_impl::implement(parse_macro_input!(input as ItemTrait)).into()
11}
12
13// TODO: remove when const generics is stable
14#[proc_macro_derive(ToContent)]
15pub fn derive_to_content(input: TokenStream) -> TokenStream {
16    let input = parse_macro_input!(input as DeriveInput);
17    let name = input.ident.clone();
18    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
19    quote!(
20        impl #impl_generics interfacer_http::ToContent for #name #ty_generics #where_clause {
21            #[inline]
22            fn to_content(&self, content_type: &interfacer_http::mime::Mime) -> core::result::Result<Vec<u8>, interfacer_http::ToContentError> {
23                use interfacer_http::polyfill::*;
24                self._to_content(content_type)
25            }
26        }
27    ).into()
28}
29
30// TODO: remove when const generics is stable
31#[proc_macro_derive(FromContent)]
32pub fn derive_from_content(input: TokenStream) -> TokenStream {
33    let input = parse_macro_input!(input as DeriveInput);
34    let name = input.ident.clone();
35    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
36    quote!(
37        impl #impl_generics interfacer_http::FromContent for #name #ty_generics #where_clause {
38            #[inline]
39            fn from_content(data: Vec<u8>, content_type: &interfacer_http::mime::Mime) -> core::result::Result<Self, interfacer_http::FromContentError> {
40                use interfacer_http::polyfill::*;
41                Self::_from_content(data, content_type)
42            }
43        }
44    ).into()
45}
46
47mod attr;
48mod method;
49mod param;
50mod parse;
51mod service_impl;