Skip to content

Commit

Permalink
build: parser: Fix: Ping360 transducer reuturn type
Browse files Browse the repository at this point in the history
  • Loading branch information
RaulTrombin committed Jul 30, 2024
1 parent cd103ef commit b2569af
Showing 1 changed file with 30 additions and 4 deletions.
34 changes: 30 additions & 4 deletions build/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ struct MessageDefinition {
description: Option<String>,
payload: Vec<Payload>,
category: MessageDefinitionCategory,
returns_message: Option<String>,
}

#[derive(Debug, PartialEq)]
Expand Down Expand Up @@ -194,12 +195,24 @@ impl MessageDefinition {
.map(|element| Payload::from_json(element))
.collect(),
category,
returns_message: value
.get("returns_message")
.and_then(|v| v.as_str())
.filter(|s| !s.is_empty())
.map(|s| s.to_string()),
}
}

pub fn emit_fn(&self) -> TokenStream {
let struct_name = quote::format_ident!("{}Struct", self.name.to_case(Case::Pascal));
let pascal_message_name = ident!(self.name.to_case(Case::Pascal));
let return_struct_name = match self.returns_message {
Some(ref message) => Some(quote::format_ident!(
"{}Struct",
message.to_case(Case::Pascal)
)),
None => None,
};

let function_name = quote::format_ident!("{}", self.name.to_case(Case::Snake));
let function_description = self
Expand Down Expand Up @@ -236,6 +249,7 @@ impl MessageDefinition {

let function_token = match self.category {
MessageDefinitionCategory::Set | MessageDefinitionCategory::Control => {
let mut return_type = quote! { () };
let result = if self.category == MessageDefinitionCategory::Set {
quote! {
let receiver = self.subscribe();
Expand All @@ -245,18 +259,30 @@ impl MessageDefinition {
self.wait_for_ack(receiver, #struct_name::id()).await
}
} else {
quote! {
self.get_common().send_message(package).await?;
// For messages from Config category that returns a structure
if let Some(value) = return_struct_name {
return_type = quote! { #value };
quote! {
let receiver = self.subscribe();

self.get_common().send_message(package).await?;

Ok(())
self.wait_for_message(receiver).await
}
} else {
quote! {
self.get_common().send_message(package).await?;

Ok(())
}
}
};

quote! {
#[doc = #function_description]
#[doc = "# Arguments"]
#(#function_parameters_description)*
pub async fn #function_name(&self, #(#function_parameters),*) -> Result<(), PingError> {
pub async fn #function_name(&self, #(#function_parameters),*) -> Result<#return_type, PingError> {
let request = Messages::#pascal_message_name(#struct_name {
#(#function_assignments,)*
});
Expand Down

0 comments on commit b2569af

Please sign in to comment.