@@ -264,7 +264,7 @@ fn escape_python_double_quoted(value: &str) -> String {
264264 value. replace ( '\\' , "\\ \\ " ) . replace ( '"' , "\\ \" " )
265265}
266266
267- fn extract_script_metadata_deps ( script : & str ) -> Vec < String > {
267+ fn extract_script_metadata_deps ( script : & str ) -> Result < Vec < String > > {
268268 let mut ss = String :: new ( ) ;
269269 let mut meta_start = false ;
270270 for line in script. lines ( ) {
@@ -280,19 +280,24 @@ fn extract_script_metadata_deps(script: &str) -> Vec<String> {
280280 }
281281 }
282282
283- let parsed = ss. parse :: < toml:: Value > ( ) . unwrap ( ) ;
283+ let parsed = ss. parse :: < toml:: Value > ( ) . map_err ( |err| {
284+ ErrorCode :: SemanticError ( format ! (
285+ "Failed to parse UDF script metadata as TOML: {err}"
286+ ) )
287+ } ) ?;
284288
285289 if parsed. get ( "dependencies" ) . is_none ( ) {
286- return Vec :: new ( ) ;
290+ return Ok ( Vec :: new ( ) ) ;
287291 }
288292
289- if let Some ( deps) = parsed[ "dependencies" ] . as_array ( ) {
293+ let deps = if let Some ( deps) = parsed[ "dependencies" ] . as_array ( ) {
290294 deps. iter ( )
291295 . filter_map ( |value| value. as_str ( ) . map ( |item| item. to_string ( ) ) )
292296 . collect ( )
293297 } else {
294298 Vec :: new ( )
295- }
299+ } ;
300+ Ok ( deps)
296301}
297302
298303fn unique_heredoc_marker ( base : & str , contents : & [ & str ] ) -> String {
@@ -607,7 +612,7 @@ impl UdfAdapter for FullTypeCheckAdapter {
607612 ErrorCode :: SemanticError ( format ! ( "Failed to parse UDF code as utf-8: {err}" ) )
608613 } ) ?;
609614 let import_assets = self . build_udf_cloud_imports ( & imports) ?;
610- let mut merged_packages = extract_script_metadata_deps ( & resolved_code) ;
615+ let mut merged_packages = extract_script_metadata_deps ( & resolved_code) ? ;
611616 merged_packages. extend_from_slice ( & packages) ;
612617 let input_types = arg_types. iter ( ) . map ( udf_type_string) . collect :: < Vec < _ > > ( ) ;
613618 let result_type = udf_type_string ( & return_type) ;
@@ -1220,3 +1225,25 @@ where A: UdfAdapter
12201225 } )
12211226 }
12221227}
1228+
1229+ #[ cfg( test) ]
1230+ mod tests {
1231+ use super :: * ;
1232+
1233+ #[ test]
1234+ fn test_extract_script_metadata_deps_returns_error_for_malformed_toml ( ) {
1235+ let err = extract_script_metadata_deps (
1236+ r#"# /// script
1237+ # dependencies = [
1238+ # ///
1239+ "# ,
1240+ )
1241+ . expect_err ( "malformed UDF script metadata should return an error" ) ;
1242+
1243+ assert_eq ! ( err. code( ) , ErrorCode :: SEMANTIC_ERROR ) ;
1244+ assert ! (
1245+ err. message( )
1246+ . contains( "Failed to parse UDF script metadata as TOML" )
1247+ ) ;
1248+ }
1249+ }
0 commit comments