use crate::*;
use syn::Ident;
pub(crate) fn generate_http_stream(
stream: &Ident,
context: &Ident,
data: &FromStreamData,
stmts: &[Stmt],
) -> TokenStream2 {
let method_ident: Ident = Ident::new("try_get_http_request", Span::call_site());
match data.variable_name.clone() {
Some(variable_name) => {
quote! {
while let Ok(#variable_name) = #stream.#method_ident().await {
#context.set_request(#variable_name.clone());
#(#stmts)*
}
::hyperlane::Status::Continue
}
}
None => {
quote! {
while let Ok(_request) = #stream.#method_ident().await {
#context.set_request(_request);
#(#stmts)*
}
::hyperlane::Status::Continue
}
}
}
}
pub(crate) fn generate_websocket_stream(
stream: &Ident,
context: &Ident,
data: &FromStreamData,
stmts: &[Stmt],
) -> TokenStream2 {
let method_ident: Ident = Ident::new("try_get_websocket_request", Span::call_site());
match data.variable_name.clone() {
Some(variable_name) => {
quote! {
while let Ok(#variable_name) = #stream.#method_ident().await {
#context.get_mut_request().set_body(#variable_name.clone());
#(#stmts)*
}
::hyperlane::Status::Continue
}
}
None => {
quote! {
while let Ok(_body) = #stream.#method_ident().await {
#context.get_mut_request().set_body(_body);
#(#stmts)*
}
::hyperlane::Status::Continue
}
}
}
}
pub(crate) fn try_get_http_request_macro(attr: TokenStream, item: TokenStream) -> TokenStream {
let data: FromStreamData = parse_macro_input!(attr as FromStreamData);
let mut input_fn: ItemFn = parse_macro_input!(item as ItemFn);
let vis: &Visibility = &input_fn.vis;
let sig: &mut Signature = &mut input_fn.sig;
let block: &Block = &input_fn.block;
let attrs: &Vec<Attribute> = &input_fn.attrs;
match parse_stream_from_signature(sig) {
Ok(stream) => match parse_context_from_signature(sig) {
Ok(context) => {
let stmts: &Vec<Stmt> = &block.stmts;
let loop_stream: TokenStream2 =
generate_http_stream(&stream, &context, &data, stmts);
quote! {
#(#attrs)*
#vis #sig {
#loop_stream
}
}
.into()
}
Err(err) => err.to_compile_error().into(),
},
Err(err) => err.to_compile_error().into(),
}
}
pub(crate) fn try_get_websocket_request_macro(attr: TokenStream, item: TokenStream) -> TokenStream {
let data: FromStreamData = parse_macro_input!(attr as FromStreamData);
let mut input_fn: ItemFn = parse_macro_input!(item as ItemFn);
let vis: &Visibility = &input_fn.vis;
let sig: &mut Signature = &mut input_fn.sig;
let block: &Block = &input_fn.block;
let attrs: &Vec<Attribute> = &input_fn.attrs;
match parse_stream_from_signature(sig) {
Ok(stream) => match parse_context_from_signature(sig) {
Ok(context) => {
let stmts: &Vec<Stmt> = &block.stmts;
let loop_stream: TokenStream2 =
generate_websocket_stream(&stream, &context, &data, stmts);
quote! {
#(#attrs)*
#vis #sig {
#loop_stream
}
}
.into()
}
Err(err) => err.to_compile_error().into(),
},
Err(err) => err.to_compile_error().into(),
}
}