@@ -10,32 +10,32 @@ use quote::quote;
1010
1111impl Generator {
1212 /// Generates index type and it's impls.
13- pub fn gen_index_def ( & mut self ) -> TokenStream {
14- let type_def = self . gen_type_def ( ) ;
13+ pub fn gen_index_def ( & mut self ) -> syn :: Result < TokenStream > {
14+ let type_def = self . gen_type_def ( ) ? ;
1515 let impl_def = self . gen_secondary_index_impl_def ( ) ;
1616 let info_def = self . gen_secondary_index_info_impl_def ( ) ;
1717 let cdc_impl_def = if self . is_persist {
1818 self . gen_secondary_index_cdc_impl_def ( )
1919 } else {
2020 quote ! { }
2121 } ;
22- let default_impl = self . gen_index_default_impl ( ) ;
22+ let default_impl = self . gen_index_default_impl ( ) ? ;
2323 let available_indexes = self . gen_available_indexes ( ) ;
2424
25- quote ! {
25+ Ok ( quote ! {
2626 #type_def
2727 #impl_def
2828 #info_def
2929 #cdc_impl_def
3030 #default_impl
3131 #available_indexes
32- }
32+ } )
3333 }
3434
3535 /// Generates table's secondary index struct definition. It has fields with index names and types varying on index
3636 /// uniqueness. For unique index it's `TreeIndex<T, Link`, for non-unique `TreeIndex<T, Arc<LockFreeSet<Link>>>`.
3737 /// Index also derives `PersistIndex` and `MemStat` macro.
38- fn gen_type_def ( & mut self ) -> TokenStream {
38+ fn gen_type_def ( & mut self ) -> syn :: Result < TokenStream > {
3939 let name_generator = WorktableNameGenerator :: from_table_name ( self . name . to_string ( ) ) ;
4040 let ident = name_generator. get_index_type_ident ( ) ;
4141 let index_rows = self
@@ -44,7 +44,10 @@ impl Generator {
4444 . iter ( )
4545 . map ( |( i, idx) | {
4646 let Some ( t) = self . columns . columns_map . get ( i) else {
47- panic ! ( "cannot find column `{i}` in this table" )
47+ return Err ( syn:: Error :: new (
48+ i. span ( ) ,
49+ format ! ( "cannot find column `{i}` in this table" ) ,
50+ ) ) ;
4851 } ;
4952 let t = if is_float ( t. to_string ( ) . as_str ( ) ) {
5053 quote ! { OrderedFloat <#t> }
@@ -54,7 +57,7 @@ impl Generator {
5457 let i = & idx. name ;
5558
5659 #[ allow( clippy:: collapsible_else_if) ]
57- if idx. is_unique {
60+ let res = if idx. is_unique {
5861 if is_unsized ( & t. to_string ( ) ) {
5962 quote ! {
6063 #i: IndexMap <#t, Link , UnsizedNode <IndexPair <#t, Link >>>
@@ -68,9 +71,10 @@ impl Generator {
6871 } else {
6972 quote ! { #i: IndexMultiMap <#t, Link >}
7073 }
71- }
74+ } ;
75+ Ok :: < _ , syn:: Error > ( res)
7276 } )
73- . collect :: < Vec < _ > > ( ) ;
77+ . collect :: < Result < Vec < _ > , syn :: Error > > ( ) ? ;
7478
7579 let derive = if self . is_persist {
7680 quote ! {
@@ -82,15 +86,15 @@ impl Generator {
8286 }
8387 } ;
8488
85- quote ! {
89+ Ok ( quote ! {
8690 #derive
8791 pub struct #ident {
8892 #( #index_rows) , *
8993 }
90- }
94+ } )
9195 }
9296
93- fn gen_index_default_impl ( & self ) -> TokenStream {
97+ fn gen_index_default_impl ( & self ) -> syn :: Result < TokenStream > {
9498 let name_generator = WorktableNameGenerator :: from_table_name ( self . name . to_string ( ) ) ;
9599 let index_type_ident = name_generator. get_index_type_ident ( ) ;
96100 let const_name = name_generator. get_page_inner_size_const_ident ( ) ;
@@ -101,7 +105,10 @@ impl Generator {
101105 . iter ( )
102106 . map ( |( i, idx) | {
103107 let Some ( t) = self . columns . columns_map . get ( i) else {
104- panic ! ( "cannot find column `{i}` in this table" )
108+ return Err ( syn:: Error :: new (
109+ i. span ( ) ,
110+ format ! ( "cannot find column `{i}` in this table" ) ,
111+ ) ) ;
105112 } ;
106113 let t = if is_float ( t. to_string ( ) . as_str ( ) ) {
107114 quote ! { OrderedFloat <#t> }
@@ -111,7 +118,7 @@ impl Generator {
111118 let i = & idx. name ;
112119
113120 #[ allow( clippy:: collapsible_else_if) ]
114- if idx. is_unique {
121+ let res = if idx. is_unique {
115122 if is_unsized ( & t. to_string ( ) ) {
116123 quote ! {
117124 #i: IndexMap :: with_maximum_node_size( #const_name) ,
@@ -125,19 +132,21 @@ impl Generator {
125132 } else {
126133 quote ! { #i: IndexMultiMap :: with_maximum_node_size( get_index_page_size_from_data_length:: <#t>( #const_name) ) , }
127134 }
128- }
135+ } ;
136+
137+ Ok :: < _ , syn:: Error > ( res)
129138 } )
130- . collect :: < Vec < _ > > ( ) ;
139+ . collect :: < Result < Vec < _ > , syn :: Error > > ( ) ? ;
131140
132- quote ! {
141+ Ok ( quote ! {
133142 impl Default for #index_type_ident {
134143 fn default ( ) -> Self {
135144 Self {
136145 #( #index_rows) *
137146 }
138147 }
139148 }
140- }
149+ } )
141150 }
142151
143152 fn gen_available_indexes ( & self ) -> TokenStream {
0 commit comments