@@ -89,42 +89,40 @@ pub(crate) fn validate_pycapsule(capsule: &Bound<PyCapsule>, name: &str) -> PyRe
89
89
90
90
Ok ( ( ) )
91
91
}
92
-
93
92
/// Convert a Python object to ScalarValue using PyArrow
94
93
///
95
94
/// Args:
96
95
/// py: Python interpreter
97
96
/// obj: Python object to convert
98
97
///
99
98
/// Returns:
100
- /// ScalarValue representation of the Python object
99
+ /// Result containing ScalarValue representation of the Python object
101
100
///
102
101
/// This function handles basic Python types directly and uses PyArrow
103
102
/// for complex types like datetime.
104
- pub ( crate ) fn py_obj_to_scalar_value ( py : Python , obj : PyObject ) -> ScalarValue {
103
+ pub ( crate ) fn py_obj_to_scalar_value ( py : Python , obj : PyObject ) -> PyResult < ScalarValue > {
105
104
if let Ok ( value) = obj. extract :: < bool > ( py) {
106
- ScalarValue :: Boolean ( Some ( value) )
105
+ return Ok ( ScalarValue :: Boolean ( Some ( value) ) ) ;
107
106
} else if let Ok ( value) = obj. extract :: < i64 > ( py) {
108
- ScalarValue :: Int64 ( Some ( value) )
107
+ return Ok ( ScalarValue :: Int64 ( Some ( value) ) ) ;
109
108
} else if let Ok ( value) = obj. extract :: < u64 > ( py) {
110
- ScalarValue :: UInt64 ( Some ( value) )
109
+ return Ok ( ScalarValue :: UInt64 ( Some ( value) ) ) ;
111
110
} else if let Ok ( value) = obj. extract :: < f64 > ( py) {
112
- ScalarValue :: Float64 ( Some ( value) )
111
+ return Ok ( ScalarValue :: Float64 ( Some ( value) ) ) ;
113
112
} else if let Ok ( value) = obj. extract :: < String > ( py) {
114
- ScalarValue :: Utf8 ( Some ( value) )
115
- } else {
116
- // For datetime and other complex types, convert via PyArrow
117
- let pa = py. import ( "pyarrow" ) ;
118
- let pa = pa. expect ( "Failed to import PyArrow" ) ;
119
- // Convert Python object to PyArrow scalar
120
- // This handles datetime objects by converting to PyArrow timestamp type
121
- let scalar = pa. call_method1 ( "scalar" , ( obj, ) ) ;
122
- let scalar = scalar. expect ( "Failed to convert Python object to PyArrow scalar" ) ;
123
- // Convert PyArrow scalar to PyScalarValue
124
- let py_scalar = PyScalarValue :: extract_bound ( scalar. as_ref ( ) ) ;
125
- // Unwrap the result - this will panic if extraction failed
126
- let py_scalar = py_scalar. expect ( "Failed to extract PyScalarValue from PyArrow scalar" ) ;
127
- // Convert PyScalarValue to ScalarValue
128
- py_scalar. into ( )
113
+ return Ok ( ScalarValue :: Utf8 ( Some ( value) ) ) ;
129
114
}
115
+
116
+ // For datetime and other complex types, convert via PyArrow
117
+ let pa = py. import ( "pyarrow" ) ?;
118
+
119
+ // Convert Python object to PyArrow scalar
120
+ let scalar = pa. call_method1 ( "scalar" , ( obj, ) ) ?;
121
+
122
+ // Convert PyArrow scalar to PyScalarValue
123
+ let py_scalar = PyScalarValue :: extract_bound ( scalar. as_ref ( ) )
124
+ . map_err ( |e| PyValueError :: new_err ( format ! ( "Failed to extract PyScalarValue: {}" , e) ) ) ?;
125
+
126
+ // Convert PyScalarValue to ScalarValue
127
+ Ok ( py_scalar. into ( ) )
130
128
}
0 commit comments