From e393e35718350eaa3f1e382383c4438b1cc488b3 Mon Sep 17 00:00:00 2001 From: Handy-caT <37216852+Handy-caT@users.noreply.github.com> Date: Sun, 10 Aug 2025 17:03:29 +0300 Subject: [PATCH 1/2] add `syn::Error`'s for proper error messages --- codegen/src/worktable/generator/index/mod.rs | 49 ++++++++++++-------- codegen/src/worktable/mod.rs | 2 +- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/codegen/src/worktable/generator/index/mod.rs b/codegen/src/worktable/generator/index/mod.rs index 61eeb7d4..774b26d4 100644 --- a/codegen/src/worktable/generator/index/mod.rs +++ b/codegen/src/worktable/generator/index/mod.rs @@ -2,7 +2,7 @@ mod cdc; mod info; mod usual; -use crate::name_generator::{WorktableNameGenerator, is_float, is_unsized}; +use crate::name_generator::{is_float, is_unsized, WorktableNameGenerator}; use crate::worktable::generator::Generator; use convert_case::{Case, Casing}; use proc_macro2::TokenStream; @@ -10,8 +10,8 @@ use quote::quote; impl Generator { /// Generates index type and it's impls. - pub fn gen_index_def(&mut self) -> TokenStream { - let type_def = self.gen_type_def(); + pub fn gen_index_def(&mut self) -> syn::Result { + let type_def = self.gen_type_def()?; let impl_def = self.gen_secondary_index_impl_def(); let info_def = self.gen_secondary_index_info_impl_def(); let cdc_impl_def = if self.is_persist { @@ -19,23 +19,23 @@ impl Generator { } else { quote! {} }; - let default_impl = self.gen_index_default_impl(); + let default_impl = self.gen_index_default_impl()?; let available_indexes = self.gen_available_indexes(); - quote! { + Ok(quote! { #type_def #impl_def #info_def #cdc_impl_def #default_impl #available_indexes - } + }) } /// Generates table's secondary index struct definition. It has fields with index names and types varying on index /// uniqueness. For unique index it's `TreeIndex>>`. /// Index also derives `PersistIndex` and `MemStat` macro. - fn gen_type_def(&mut self) -> TokenStream { + fn gen_type_def(&mut self) -> syn::Result { let name_generator = WorktableNameGenerator::from_table_name(self.name.to_string()); let ident = name_generator.get_index_type_ident(); let index_rows = self @@ -44,7 +44,10 @@ impl Generator { .iter() .map(|(i, idx)| { let Some(t) = self.columns.columns_map.get(i) else { - panic!("cannot find column `{i}` in this table") + return Err(syn::Error::new( + i.span(), + format!("cannot find column `{i}` in this table"), + )); }; let t = if is_float(t.to_string().as_str()) { quote! { OrderedFloat<#t> } @@ -54,7 +57,7 @@ impl Generator { let i = &idx.name; #[allow(clippy::collapsible_else_if)] - if idx.is_unique { + let res = if idx.is_unique { if is_unsized(&t.to_string()) { quote! { #i: IndexMap<#t, Link, UnsizedNode>> @@ -68,9 +71,10 @@ impl Generator { } else { quote! {#i: IndexMultiMap<#t, Link>} } - } + }; + Ok::<_, syn::Error>(res) }) - .collect::>(); + .collect::, syn::Error>>()?; let derive = if self.is_persist { quote! { @@ -82,15 +86,15 @@ impl Generator { } }; - quote! { + Ok(quote! { #derive pub struct #ident { #(#index_rows),* } - } + }) } - fn gen_index_default_impl(&self) -> TokenStream { + fn gen_index_default_impl(&self) -> syn::Result { let name_generator = WorktableNameGenerator::from_table_name(self.name.to_string()); let index_type_ident = name_generator.get_index_type_ident(); let const_name = name_generator.get_page_inner_size_const_ident(); @@ -101,7 +105,10 @@ impl Generator { .iter() .map(|(i, idx)| { let Some(t) = self.columns.columns_map.get(i) else { - panic!("cannot find column `{i}` in this table") + return Err(syn::Error::new( + i.span(), + format!("cannot find column `{i}` in this table"), + )); }; let t = if is_float(t.to_string().as_str()) { quote! { OrderedFloat<#t> } @@ -111,7 +118,7 @@ impl Generator { let i = &idx.name; #[allow(clippy::collapsible_else_if)] - if idx.is_unique { + let res = if idx.is_unique { if is_unsized(&t.to_string()) { quote! { #i: IndexMap::with_maximum_node_size(#const_name), @@ -125,11 +132,13 @@ impl Generator { } else { quote! {#i: IndexMultiMap::with_maximum_node_size(get_index_page_size_from_data_length::<#t>(#const_name)),} } - } + }; + + Ok::<_, syn::Error>(res) }) - .collect::>(); + .collect::, syn::Error>>()?; - quote! { + Ok(quote! { impl Default for #index_type_ident { fn default() -> Self { Self { @@ -137,7 +146,7 @@ impl Generator { } } } - } + }) } fn gen_available_indexes(&self) -> TokenStream { diff --git a/codegen/src/worktable/mod.rs b/codegen/src/worktable/mod.rs index 45364582..90583c66 100644 --- a/codegen/src/worktable/mod.rs +++ b/codegen/src/worktable/mod.rs @@ -51,7 +51,7 @@ pub fn expand(input: TokenStream) -> syn::Result { let row_def = generator.gen_row_def(); let wrapper_def = generator.gen_wrapper_def(); let locks_def = generator.gen_locks_def(); - let index_def = generator.gen_index_def(); + let index_def = generator.gen_index_def()?; let table_def = generator.gen_table_def()?; let query_types_def = generator.gen_result_types_def()?; let query_available_def = generator.gen_available_types_def()?; From 7ac082df72c5fe9e02fff579793dd64ba945fcf6 Mon Sep 17 00:00:00 2001 From: Handy-caT <37216852+Handy-caT@users.noreply.github.com> Date: Sun, 10 Aug 2025 17:08:35 +0300 Subject: [PATCH 2/2] fmt --- codegen/src/worktable/generator/index/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codegen/src/worktable/generator/index/mod.rs b/codegen/src/worktable/generator/index/mod.rs index 774b26d4..a258df2b 100644 --- a/codegen/src/worktable/generator/index/mod.rs +++ b/codegen/src/worktable/generator/index/mod.rs @@ -2,7 +2,7 @@ mod cdc; mod info; mod usual; -use crate::name_generator::{is_float, is_unsized, WorktableNameGenerator}; +use crate::name_generator::{WorktableNameGenerator, is_float, is_unsized}; use crate::worktable::generator::Generator; use convert_case::{Case, Casing}; use proc_macro2::TokenStream;