11// SPDX-License-Identifier: (Apache-2.0 OR MIT)
22
33use crate :: deserialize:: cache:: * ;
4+ use crate :: deserialize:: DeserializeError ;
45use crate :: exc:: * ;
56use crate :: ffi:: * ;
67use crate :: typeref:: * ;
@@ -14,14 +15,14 @@ use std::ptr::NonNull;
1415
1516pub fn deserialize (
1617 ptr : * mut pyo3:: ffi:: PyObject ,
17- ) -> std:: result:: Result < NonNull < pyo3:: ffi:: PyObject > , String > {
18+ ) -> std:: result:: Result < NonNull < pyo3:: ffi:: PyObject > , DeserializeError < ' static > > {
1819 let obj_type_ptr = ob_type ! ( ptr) ;
1920 let contents: & [ u8 ] ;
2021 if is_type ! ( obj_type_ptr, STR_TYPE ) {
2122 let mut str_size: pyo3:: ffi:: Py_ssize_t = 0 ;
2223 let uni = read_utf8_from_str ( ptr, & mut str_size) ;
2324 if unlikely ! ( uni. is_null( ) ) {
24- return Err ( INVALID_STR . to_string ( ) ) ;
25+ return Err ( DeserializeError :: new ( Cow :: Borrowed ( INVALID_STR ) , 0 , 0 , "" ) ) ;
2526 }
2627 contents = unsafe { std:: slice:: from_raw_parts ( uni, str_size as usize ) } ;
2728 } else {
@@ -33,19 +34,29 @@ pub fn deserialize(
3334 } else if is_type ! ( obj_type_ptr, MEMORYVIEW_TYPE ) {
3435 let membuf = unsafe { PyMemoryView_GET_BUFFER ( ptr) } ;
3536 if unsafe { pyo3:: ffi:: PyBuffer_IsContiguous ( membuf, b'C' as c_char ) == 0 } {
36- return Err ( "Input type memoryview must be a C contiguous buffer" . to_string ( ) ) ;
37+ return Err ( DeserializeError :: new (
38+ Cow :: Borrowed ( "Input type memoryview must be a C contiguous buffer" ) ,
39+ 0 ,
40+ 0 ,
41+ "" ,
42+ ) ) ;
3743 }
3844 buffer = unsafe { ( * membuf) . buf as * const u8 } ;
3945 length = unsafe { ( * membuf) . len as usize } ;
4046 } else if is_type ! ( obj_type_ptr, BYTEARRAY_TYPE ) {
4147 buffer = ffi ! ( PyByteArray_AsString ( ptr) ) as * const u8 ;
4248 length = ffi ! ( PyByteArray_Size ( ptr) ) as usize ;
4349 } else {
44- return Err ( "Input must be bytes, bytearray, memoryview, or str" . to_string ( ) ) ;
50+ return Err ( DeserializeError :: new (
51+ Cow :: Borrowed ( "Input must be bytes, bytearray, memoryview, or str" ) ,
52+ 0 ,
53+ 0 ,
54+ "" ,
55+ ) ) ;
4556 }
4657 contents = unsafe { std:: slice:: from_raw_parts ( buffer, length) } ;
4758 if encoding_rs:: Encoding :: utf8_valid_up_to ( contents) != length {
48- return Err ( INVALID_STR . to_string ( ) ) ;
59+ return Err ( DeserializeError :: new ( Cow :: Borrowed ( INVALID_STR ) , 0 , 0 , "" ) ) ;
4960 }
5061 }
5162
@@ -55,10 +66,17 @@ pub fn deserialize(
5566 let seed = JsonValue { } ;
5667 match seed. deserialize ( & mut deserializer) {
5768 Ok ( obj) => {
58- deserializer. end ( ) . map_err ( |e| e. to_string ( ) ) ?;
69+ deserializer. end ( ) . map_err ( |e| {
70+ DeserializeError :: new ( Cow :: Owned ( e. to_string ( ) ) , e. line ( ) , e. column ( ) , data)
71+ } ) ?;
5972 Ok ( obj)
6073 }
61- Err ( e) => Err ( e. to_string ( ) ) ,
74+ Err ( e) => Err ( DeserializeError :: new (
75+ Cow :: Owned ( e. to_string ( ) ) ,
76+ e. line ( ) ,
77+ e. column ( ) ,
78+ data,
79+ ) ) ,
6280 }
6381}
6482
0 commit comments