@@ -124,15 +124,17 @@ pub async fn get_sql_query_param(
124124 single_table_name : & Option < & str > ,
125125 table_with_joins : & Option < Vec < TableWithJoins > > ,
126126 db_conn : & DBConn ,
127- ) -> Option < ( TsFieldType , bool , Option < String > ) > {
127+ ) -> Result < Option < ( TsFieldType , bool , Option < String > ) > , TsGeneratorError > {
128128 let table_name: Option < String > ;
129129
130130 if table_with_joins. is_some ( ) {
131131 table_name = translate_table_from_expr ( table_with_joins, & left. clone ( ) ) . ok ( ) ;
132132 } else if single_table_name. is_some ( ) {
133133 table_name = single_table_name. map ( |x| x. to_string ( ) ) ;
134134 } else {
135- panic ! ( "failed to find an appropriate table name while processing WHERE statement" )
135+ return Err ( TsGeneratorError :: TableNameInferenceFailedInWhere {
136+ query : left. to_string ( ) ,
137+ } ) ;
136138 }
137139
138140 let column_name = translate_column_name_expr ( left) ;
@@ -149,15 +151,27 @@ pub async fn get_sql_query_param(
149151 . await
150152 . fetch_table ( & table_names, db_conn)
151153 . await
152- . unwrap_or_else ( || panic ! ( "Failed to fetch columns for table {table_name}" ) ) ;
154+ . ok_or_else ( || TsGeneratorError :: TableNotFoundInSchema {
155+ table : table_name. clone ( ) ,
156+ } ) ?;
153157
154158 // get column and return TsFieldType
155- let column = columns
156- . get ( column_name. as_str ( ) )
157- . unwrap_or_else ( || panic ! ( "Failed to find the column from the table schema of {table_name}" ) ) ;
158- Some ( ( column. field_type . to_owned ( ) , column. is_nullable , Some ( expr_placeholder) ) )
159+ let column = columns. get ( column_name. as_str ( ) ) . ok_or_else ( || {
160+ let available_columns = columns. keys ( ) . map ( |k| k. as_str ( ) ) . collect :: < Vec < _ > > ( ) . join ( ", " ) ;
161+ TsGeneratorError :: ColumnNotFoundInTable {
162+ column : column_name. clone ( ) ,
163+ table : table_name. clone ( ) ,
164+ available_columns,
165+ }
166+ } ) ?;
167+
168+ Ok ( Some ( (
169+ column. field_type . to_owned ( ) ,
170+ column. is_nullable ,
171+ Some ( expr_placeholder) ,
172+ ) ) )
159173 }
160- _ => None ,
174+ _ => Ok ( None ) ,
161175 }
162176}
163177
@@ -298,7 +312,7 @@ pub async fn translate_expr(
298312 // OPERATORS START //
299313 /////////////////////
300314 Expr :: BinaryOp { left, op : _, right } => {
301- let param = get_sql_query_param ( left, right, single_table_name, table_with_joins, db_conn) . await ;
315+ let param = get_sql_query_param ( left, right, single_table_name, table_with_joins, db_conn) . await ? ;
302316 if let Some ( ( value, is_nullable, index) ) = param {
303317 let _ = ts_query. insert_param ( & value, & is_nullable, & index) ;
304318 Ok ( ( ) )
@@ -341,7 +355,7 @@ pub async fn translate_expr(
341355 table_with_joins,
342356 db_conn,
343357 )
344- . await ;
358+ . await ? ;
345359
346360 if let Some ( ( value, is_nullable, index) ) = result {
347361 let array_item = TsFieldType :: Array ( Box :: new ( value) ) ;
@@ -369,8 +383,8 @@ pub async fn translate_expr(
369383 low,
370384 high,
371385 } => {
372- let low = get_sql_query_param ( expr, low, single_table_name, table_with_joins, db_conn) . await ;
373- let high = get_sql_query_param ( expr, high, single_table_name, table_with_joins, db_conn) . await ;
386+ let low = get_sql_query_param ( expr, low, single_table_name, table_with_joins, db_conn) . await ? ;
387+ let high = get_sql_query_param ( expr, high, single_table_name, table_with_joins, db_conn) . await ? ;
374388 if let Some ( ( value, is_nullable, placeholder) ) = low {
375389 ts_query. insert_param ( & value, & is_nullable, & placeholder) ?;
376390 }
@@ -731,16 +745,35 @@ pub async fn translate_assignment(
731745 let value = get_expr_placeholder ( & assignment. value ) ;
732746
733747 if value. is_some ( ) {
734- let table_details = & DB_SCHEMA
748+ let table_details = DB_SCHEMA
735749 . lock ( )
736750 . await
737751 . fetch_table ( & vec ! [ table_name] , db_conn)
738752 . await
739- . unwrap ( ) ;
740- let column_name = translate_column_name_assignment ( assignment) . unwrap ( ) ;
741- let field = table_details
742- . get ( & column_name)
743- . unwrap_or_else ( || panic ! ( "Failed to find the column detail for {column_name}" ) ) ;
753+ . ok_or_else ( || TsGeneratorError :: TableNotFoundInSchema {
754+ table : table_name. to_string ( ) ,
755+ } ) ?;
756+
757+ let column_name = translate_column_name_assignment ( assignment) . ok_or_else ( || {
758+ TsGeneratorError :: UpdateStatementProcessingFailed {
759+ reason : "Failed to extract column name from assignment" . to_string ( ) ,
760+ query : format ! ( "UPDATE {} SET {} = ..." , table_name, assignment) ,
761+ }
762+ } ) ?;
763+
764+ let field = table_details. get ( & column_name) . ok_or_else ( || {
765+ let available_columns = table_details
766+ . keys ( )
767+ . map ( |k| k. as_str ( ) )
768+ . collect :: < Vec < _ > > ( )
769+ . join ( ", " ) ;
770+ TsGeneratorError :: ColumnNotFoundInTable {
771+ column : column_name. clone ( ) ,
772+ table : table_name. to_string ( ) ,
773+ available_columns,
774+ }
775+ } ) ?;
776+
744777 let _ = ts_query. insert_param ( & field. field_type , & field. is_nullable , & value) ;
745778 }
746779 Ok ( ( ) )
0 commit comments