pub fn send_msg(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let parsed_args = syn::parse_macro_input!(input as SenderParsedArguments);
let actor_system = parsed_args.actor_system;
let address = parsed_args.address;
let message = parsed_args.message;
let tokens = quote! {
{
let actor_system = #actor_system;
let address = #address;
let message = #message;
let mut response_rxs = Vec::new();
for crate::RegisterForm {
message_tx,
..
} in crate::ActorSystem::whois(actor_system.map(), address) {
let (response_tx, response_rx) = tokio::sync::oneshot::channel();
let _ = message_tx.send(
(
bincode::serialize(message)
.expect("Failed to serialize message"),
response_tx,
),
);
response_rxs.push(response_rx);
}
response_rxs
}
};
tokens.into()
}
pub fn recv_res(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let parsed_args = syn::parse_macro_input!(input as ReceiverParsedArguments);
let res_type = parsed_args.res_type;
let response_rxs = parsed_args.response_rxs;
let tokens = quote! {
{
let mut responses = Vec::new();
let response_rxs = #response_rxs;
for response_rx in response_rxs {
let response = response_rx.await.expect("Failed to receive response");
responses.push(bincode::deserialize::<#res_type>(&response)
.expect("Failed to deserialize response"));
}
responses
}
};
tokens.into()
}
struct SenderParsedArguments {
actor_system: syn::Expr,
address: syn::Expr,
message: syn::Expr,
}
struct ReceiverParsedArguments {
res_type: syn::Ident,
response_rxs: syn::Expr,
}
impl syn::parse::Parse for SenderParsedArguments {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let actor_system: syn::Expr = input.parse()?;
input.parse::<syn::Token![,]>()?;
let address: syn::Expr = input.parse()?;
input.parse::<syn::Token![,]>()?;
let message: syn::Expr = input.parse()?;
Ok(SenderParsedArguments {
actor_system,
address,
message,
})
}
}
impl syn::parse::Parse for ReceiverParsedArguments {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let res_type: syn::Ident = input.parse()?;
input.parse::<syn::Token![,]>()?;
let response_rxs: syn::Expr = input.parse()?;
Ok(ReceiverParsedArguments {
res_type,
response_rxs,
})
}
}