From b492d097e7dc1332c6de8c2edcc7888ef562d92d Mon Sep 17 00:00:00 2001 From: Wataru Otsubo Date: Mon, 14 Apr 2025 07:27:15 +0000 Subject: [PATCH] Improve errormsg --- CHANGELOG.md | 4 ++++ src/generator.rs | 58 +++++++++++++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 317a18b..a155b60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Packagin with Nix flakes (with nixpkgs buildRustPackage) [!16](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/16) - Now xml metadata can be overwritten with corresponding environmental variables. [!17](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/17) +### Changed + +- Improve error message from syn in generator. !15 + ## [0.3.1] - 2025-04-11 ### Changed 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)) } }