@@ -188,44 +188,45 @@ impl<'de> Visitor<'de> for PyObjectDeserializer<'de> {
188188 }
189189}
190190
191+ pub fn ser_pyobject ( vm : & mut VirtualMachine , obj : & PyObjectRef ) -> PyResult < String > {
192+ let serializer = PyObjectSerializer { pyobject : obj, vm } ;
193+ serde_json:: to_string ( & serializer) . map_err ( |err| vm. new_type_error ( err. to_string ( ) ) )
194+ }
195+
196+ pub fn de_pyobject ( vm : & mut VirtualMachine , s : & str ) -> PyResult {
197+ let de = PyObjectDeserializer { vm } ;
198+ // TODO: Support deserializing string sub-classes
199+ de. deserialize ( & mut serde_json:: Deserializer :: from_str ( s) )
200+ . map_err ( |err| {
201+ let json_decode_error = vm
202+ . sys_module
203+ . get_item ( "modules" )
204+ . unwrap ( )
205+ . get_item ( "json" )
206+ . unwrap ( )
207+ . get_item ( "JSONDecodeError" )
208+ . unwrap ( ) ;
209+ let exc = vm. new_exception ( json_decode_error, format ! ( "{}" , err) ) ;
210+ vm. ctx . set_attr ( & exc, "lineno" , vm. ctx . new_int ( err. line ( ) ) ) ;
211+ vm. ctx . set_attr ( & exc, "colno" , vm. ctx . new_int ( err. column ( ) ) ) ;
212+ exc
213+ } )
214+ }
215+
191216/// Implement json.dumps
192217fn json_dumps ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
193218 // TODO: Implement non-trivial serialisation case
194219 arg_check ! ( vm, args, required = [ ( obj, None ) ] ) ;
195- let res = {
196- let serializer = PyObjectSerializer { pyobject : obj, vm } ;
197- serde_json:: to_string ( & serializer)
198- } ;
199- let string = res. map_err ( |err| vm. new_type_error ( format ! ( "{}" , err) ) ) ?;
220+ let string = ser_pyobject ( vm, obj) ?;
200221 Ok ( vm. context ( ) . new_str ( string) )
201222}
202223
203224/// Implement json.loads
204225fn json_loads ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
205226 // TODO: Implement non-trivial deserialization case
206227 arg_check ! ( vm, args, required = [ ( string, Some ( vm. ctx. str_type( ) ) ) ] ) ;
207- let res = {
208- let de = PyObjectDeserializer { vm } ;
209- // TODO: Support deserializing string sub-classes
210- de. deserialize ( & mut serde_json:: Deserializer :: from_str ( & objstr:: get_value (
211- & string,
212- ) ) )
213- } ;
214-
215- res. map_err ( |err| {
216- let json_decode_error = vm
217- . sys_module
218- . get_item ( "modules" )
219- . unwrap ( )
220- . get_item ( "json" )
221- . unwrap ( )
222- . get_item ( "JSONDecodeError" )
223- . unwrap ( ) ;
224- let exc = vm. new_exception ( json_decode_error, format ! ( "{}" , err) ) ;
225- vm. ctx . set_attr ( & exc, "lineno" , vm. ctx . new_int ( err. line ( ) ) ) ;
226- vm. ctx . set_attr ( & exc, "colno" , vm. ctx . new_int ( err. column ( ) ) ) ;
227- exc
228- } )
228+
229+ de_pyobject ( vm, & objstr:: get_value ( & string) )
229230}
230231
231232pub fn make_module ( ctx : & PyContext ) -> PyObjectRef {
0 commit comments