node-macro: modernize node macro

This commit is contained in:
firestar99
2025-09-05 00:23:33 +02:00
parent aba44eb676
commit 69f9ef30cc
2 changed files with 6 additions and 19 deletions
+2 -2
View File
@@ -13,7 +13,7 @@ mod validation;
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn node(attr: TokenStream, item: TokenStream) -> TokenStream { pub fn node(attr: TokenStream, item: TokenStream) -> TokenStream {
// Performs the `node_impl` macro's functionality of attaching an `impl Node for TheGivenStruct` block to the node struct // Performs the `node_impl` macro's functionality of attaching an `impl Node for TheGivenStruct` block to the node struct
parsing::new_node_fn(attr.into(), item.into()).into() parsing::new_node_fn(attr.into(), item.into()).unwrap_or_else(|err| err.to_compile_error()).into()
} }
/// Generate meta-information for an enum. /// Generate meta-information for an enum.
@@ -27,5 +27,5 @@ pub fn node(attr: TokenStream, item: TokenStream) -> TokenStream {
/// Doc comments on a variant become tooltip text. /// Doc comments on a variant become tooltip text.
#[proc_macro_derive(ChoiceType, attributes(widget, menu_separator, label, icon))] #[proc_macro_derive(ChoiceType, attributes(widget, menu_separator, label, icon))]
pub fn derive_choice_type(input_item: TokenStream) -> TokenStream { pub fn derive_choice_type(input_item: TokenStream) -> TokenStream {
TokenStream::from(derive_choice_type::derive_choice_type_impl(input_item.into()).unwrap_or_else(|err| err.to_compile_error())) derive_choice_type::derive_choice_type_impl(input_item.into()).unwrap_or_else(|err| err.to_compile_error()).into()
} }
+4 -17
View File
@@ -642,24 +642,11 @@ fn extract_attribute<'a>(attrs: &'a [Attribute], name: &str) -> Option<&'a Attri
} }
// Modify the new_node_fn function to use the code generation // Modify the new_node_fn function to use the code generation
pub fn new_node_fn(attr: TokenStream2, item: TokenStream2) -> TokenStream2 { pub fn new_node_fn(attr: TokenStream2, item: TokenStream2) -> syn::Result<TokenStream2> {
let parse_result = parse_node_fn(attr, item.clone()); let mut parsed_node = parse_node_fn(attr, item.clone()).map_err(|e| Error::new(e.span(), format!("Failed to parse node function: {e}")))?;
let Ok(mut parsed_node) = parse_result else {
let e = parse_result.unwrap_err();
return Error::new(e.span(), format!("Failed to parse node function: {e}")).to_compile_error();
};
parsed_node.replace_impl_trait_in_input(); parsed_node.replace_impl_trait_in_input();
if let Err(e) = crate::validation::validate_node_fn(&parsed_node) { crate::validation::validate_node_fn(&parsed_node).map_err(|e| Error::new(e.span(), format!("Validation Error: {e}")))?;
return Error::new(e.span(), format!("Validation Error:\n{e}")).to_compile_error(); generate_node_code(&parsed_node).map_err(|e| Error::new(e.span(), format!("Failed to generate node code: {e}")))
}
match generate_node_code(&parsed_node) {
Ok(parsed) => parsed,
Err(e) => {
// Return the error as a compile error
Error::new(e.span(), format!("Failed to parse node function: {e}")).to_compile_error()
}
}
} }
impl ParsedNodeFn { impl ParsedNodeFn {