@@ -10,7 +10,7 @@ use postgres_protocol::types;
1010use pyo3:: {
1111 types:: {
1212 PyAnyMethods , PyBool , PyBytes , PyDate , PyDateTime , PyDict , PyDictMethods , PyFloat , PyInt ,
13- PyList , PyListMethods , PyString , PyTime , PyTuple ,
13+ PyList , PyListMethods , PyString , PyTime , PyTuple , PyTypeMethods ,
1414 } ,
1515 Bound , Py , PyAny , Python , ToPyObject ,
1616} ;
@@ -23,8 +23,8 @@ use crate::{
2323 additional_types:: { RustMacAddr6 , RustMacAddr8 } ,
2424 exceptions:: rust_errors:: { RustPSQLDriverError , RustPSQLDriverPyResult } ,
2525 extra_types:: {
26- BigInt , Integer , PyCustomType , PyJSON , PyJSONB , PyMacAddr6 , PyMacAddr8 , PyText , PyUUID ,
27- PyVarChar , SmallInt ,
26+ BigInt , Integer , PyCustomType , PyJSON , PyJSONB , PyMacAddr6 , PyMacAddr8 , PyText , PyVarChar ,
27+ SmallInt ,
2828 } ,
2929} ;
3030
@@ -303,26 +303,6 @@ pub fn py_to_rust(parameter: &pyo3::Bound<'_, PyAny>) -> RustPSQLDriverPyResult<
303303 return Ok ( PythonDTO :: PyBytes ( parameter. extract :: < Vec < u8 > > ( ) ?) ) ;
304304 }
305305
306- if parameter. is_instance_of :: < PyDateTime > ( ) {
307- let timestamp_tz = parameter. extract :: < DateTime < FixedOffset > > ( ) ;
308- if let Ok ( pydatetime_tz) = timestamp_tz {
309- return Ok ( PythonDTO :: PyDateTimeTz ( pydatetime_tz) ) ;
310- }
311-
312- let timestamp_no_tz = parameter. extract :: < NaiveDateTime > ( ) ;
313- if let Ok ( pydatetime_no_tz) = timestamp_no_tz {
314- return Ok ( PythonDTO :: PyDateTime ( pydatetime_no_tz) ) ;
315- }
316-
317- return Err ( RustPSQLDriverError :: PyToRustValueConversionError (
318- "Can not convert you datetime to rust type" . into ( ) ,
319- ) ) ;
320- }
321-
322- if parameter. is_instance_of :: < PyUUID > ( ) {
323- return Ok ( PythonDTO :: PyUUID ( parameter. extract :: < PyUUID > ( ) ?. inner ( ) ) ) ;
324- }
325-
326306 if parameter. is_instance_of :: < PyText > ( ) {
327307 return Ok ( PythonDTO :: PyText ( parameter. extract :: < PyText > ( ) ?. inner ( ) ) ) ;
328308 }
@@ -364,6 +344,22 @@ pub fn py_to_rust(parameter: &pyo3::Bound<'_, PyAny>) -> RustPSQLDriverPyResult<
364344 return Ok ( PythonDTO :: PyIntI32 ( parameter. extract :: < i32 > ( ) ?) ) ;
365345 }
366346
347+ if parameter. is_instance_of :: < PyDateTime > ( ) {
348+ let timestamp_tz = parameter. extract :: < DateTime < FixedOffset > > ( ) ;
349+ if let Ok ( pydatetime_tz) = timestamp_tz {
350+ return Ok ( PythonDTO :: PyDateTimeTz ( pydatetime_tz) ) ;
351+ }
352+
353+ let timestamp_no_tz = parameter. extract :: < NaiveDateTime > ( ) ;
354+ if let Ok ( pydatetime_no_tz) = timestamp_no_tz {
355+ return Ok ( PythonDTO :: PyDateTime ( pydatetime_no_tz) ) ;
356+ }
357+
358+ return Err ( RustPSQLDriverError :: PyToRustValueConversionError (
359+ "Can not convert you datetime to rust type" . into ( ) ,
360+ ) ) ;
361+ }
362+
367363 if parameter. is_instance_of :: < PyDate > ( ) {
368364 return Ok ( PythonDTO :: PyDate ( parameter. extract :: < NaiveDate > ( ) ?) ) ;
369365 }
@@ -429,6 +425,12 @@ pub fn py_to_rust(parameter: &pyo3::Bound<'_, PyAny>) -> RustPSQLDriverPyResult<
429425 ) ) ;
430426 }
431427
428+ if parameter. get_type ( ) . name ( ) ? == "UUID" {
429+ return Ok ( PythonDTO :: PyUUID ( Uuid :: parse_str (
430+ parameter. str ( ) ?. extract :: < & str > ( ) ?,
431+ ) ?) ) ;
432+ }
433+
432434 if let Ok ( id_address) = parameter. extract :: < IpAddr > ( ) {
433435 return Ok ( PythonDTO :: PyIpAddress ( id_address) ) ;
434436 }
0 commit comments