use crate::*;
pub(crate) fn response_status_code_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let value: Expr = match parse(attr) {
Ok(v) => v,
Err(err) => return err.to_compile_error().into(),
};
inject(position, item, |context| {
let new_context: TokenStream2 = leak_mut_context(context);
quote! {
#new_context.get_mut_response().set_status_code(::hyperlane::ResponseStatusCode::from(#value as usize));
}
})
}
pub(crate) fn response_reason_phrase_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let value: Expr = match parse(attr) {
Ok(v) => v,
Err(err) => return err.to_compile_error().into(),
};
inject(position, item, |context| {
let new_context: TokenStream2 = leak_mut_context(context);
quote! {
#new_context.get_mut_response().set_reason_phrase(&#value);
}
})
}
pub(crate) fn response_header_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let header_data: ResponseHeaderData = parse_macro_input!(attr as ResponseHeaderData);
let key: Expr = header_data.key;
let value: Expr = header_data.value;
let operation: HeaderOperation = header_data.operation;
inject(position, item, |context| {
let new_context: TokenStream2 = leak_mut_context(context);
match operation {
HeaderOperation::Add => {
quote! {
#new_context.get_mut_response().add_header(&#key, &#value);
}
}
HeaderOperation::Set => {
quote! {
#new_context.get_mut_response().set_header(&#key, &#value);
}
}
}
})
}
pub(crate) fn response_body_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let body_data: ResponseBodyData = parse_macro_input!(attr as ResponseBodyData);
let body: Expr = body_data.body;
inject(position, item, |context| {
let new_context: TokenStream2 = leak_mut_context(context);
quote! {
#new_context.get_mut_response().set_body(&#body);
}
})
}
pub(crate) fn clear_response_headers_macro(item: TokenStream, position: Position) -> TokenStream {
inject(position, item, |context| {
let new_context: TokenStream2 = leak_mut_context(context);
quote! {
#new_context.get_mut_response().clear_headers();
}
})
}
pub(crate) fn response_version_macro(
attr: TokenStream,
item: TokenStream,
position: Position,
) -> TokenStream {
let value: Expr = match parse(attr) {
Ok(v) => v,
Err(err) => return err.to_compile_error().into(),
};
inject(position, item, |context| {
let new_context: TokenStream2 = leak_mut_context(context);
quote! {
#new_context.get_mut_response().set_version(#value);
}
})
}