From 8a774f1d563f61335cd3b076129e3309404fc943 Mon Sep 17 00:00:00 2001 From: Wataru Otsubo Date: Sat, 12 Apr 2025 00:09:41 +0900 Subject: [PATCH] update(generator): improve error message from syn error --- src/generator.rs | 58 +++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/generator.rs b/src/generator.rs index f4487b4..110e4f1 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -26,8 +26,12 @@ use thiserror::Error; #[derive(Debug, Error)] pub enum CodeGenError { - #[error("tokenization(syn) error")] - SynError(#[from] syn::Error), + #[error("tokenization(syn) error: {source}: {code}")] + SynError { + #[source] + source: syn::Error, + code: String, + }, #[error("failed to create file (name duplicated): {0}")] FilePathDuplicatedError(String), #[error("parent is required for {module}")] @@ -42,11 +46,17 @@ mod util { use super::CodeGenError; pub(super) fn parse_to_ident(s: &str) -> Result { - Ok(syn::parse_str(s)?) + syn::parse_str(s).map_err(|e| CodeGenError::SynError { + source: e, + code: s.to_string(), + }) } pub(super) fn parse_to_literal(s: &str) -> Result { - Ok(syn::parse_str(s)?) + syn::parse_str(s).map_err(|e| CodeGenError::SynError { + source: e, + code: s.to_string(), + }) } // currently only U32 is used, so `dead_code` for Debug, PartialEq @@ -161,27 +171,29 @@ This code is auto generated using endcap_sl_software_ri_generator. GENERATOR_GIT_SHA, ); let files = self.generate_register_interface(None, None, HashMap::new())?; - Ok(files + files .into_iter() - .map( - |(path, tokens)| -> Result<(PathBuf, syn::File), syn::Error> { - let tokens = if path - .file_name() - .is_some_and(|file| file == "register_interface.rs") - { - quote! { - #![doc = #build_metadata] + .map(|(path, tokens)| -> Result<(PathBuf, syn::File), _> { + let tokens = if path + .file_name() + .is_some_and(|file| file == "register_interface.rs") + { + quote! { + #![doc = #build_metadata] - #tokens - } - } else { - tokens - }; - let file: syn::File = syn::parse2(tokens)?; - Ok((path, file)) - }, - ) - .process_results(|kv| HashMap::from_iter(kv))?) + #tokens + } + } else { + tokens + }; + let file: syn::File = + syn::parse2(tokens.clone()).map_err(|e| CodeGenError::SynError { + source: e, + code: tokens.to_string(), + })?; + Ok((path, file)) + }) + .process_results(|kv| HashMap::from_iter(kv)) } }