init
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
use proc_macro::TokenStream;
|
||||
use quote::quote;
|
||||
use syn::{Data, DeriveInput, parse_macro_input};
|
||||
|
||||
#[proc_macro_derive(RocketResponder)]
|
||||
pub fn derive_rocket_responder(input: TokenStream) -> TokenStream {
|
||||
let input = parse_macro_input!(input as DeriveInput);
|
||||
let name = input.ident;
|
||||
|
||||
// Inspect whether the input is an enum. prost enums implement prost::Enumeration.
|
||||
let expanded = match input.data {
|
||||
Data::Enum(_) => {
|
||||
// For enums: cast to i32 using prost::Enumeration::value
|
||||
quote! {
|
||||
impl<'r> rocket::response::Responder<'r, 'static> for #name {
|
||||
fn respond_to(self, req: &'r rocket::Request<'_>)
|
||||
-> rocket::response::Result<'static>
|
||||
{
|
||||
// Get integer value from prost enum
|
||||
let value = self.as_str_name();
|
||||
|
||||
rocket::Response::build_from(value.respond_to(req)?)
|
||||
.header(rocket::http::ContentType::new("application", "text"))
|
||||
.ok()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For structs / messages (the prost::Message case)
|
||||
_ => {
|
||||
quote! {
|
||||
impl<'r> rocket::response::Responder<'r, 'static> for #name {
|
||||
fn respond_to(self, req: &'r rocket::Request<'_>)
|
||||
-> rocket::response::Result<'static>
|
||||
{
|
||||
// encode_to_vec comes from prost::Message that prost derives for
|
||||
// generated types
|
||||
let bytes = prost::Message::encode_to_vec(&self);
|
||||
rocket::Response::build_from(bytes.respond_to(req)?)
|
||||
.header(rocket::http::ContentType::new("application", "protobuf"))
|
||||
.ok()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TokenStream::from(expanded)
|
||||
}
|
||||
Reference in New Issue
Block a user