Skip to content

Commit e0f8d8e

Browse files
authored
Use syn::Error's for proper error messages (#106)
1 parent 86a74ba commit e0f8d8e

File tree

2 files changed

+29
-20
lines changed

2 files changed

+29
-20
lines changed

codegen/src/worktable/generator/index/mod.rs

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,32 @@ use quote::quote;
1010

1111
impl 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 {

codegen/src/worktable/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub fn expand(input: TokenStream) -> syn::Result<TokenStream> {
5151
let row_def = generator.gen_row_def();
5252
let wrapper_def = generator.gen_wrapper_def();
5353
let locks_def = generator.gen_locks_def();
54-
let index_def = generator.gen_index_def();
54+
let index_def = generator.gen_index_def()?;
5555
let table_def = generator.gen_table_def()?;
5656
let query_types_def = generator.gen_result_types_def()?;
5757
let query_available_def = generator.gen_available_types_def()?;

0 commit comments

Comments
 (0)