1
1
//! Python entry point for running a query.
2
2
use pyo3:: prelude:: * ;
3
3
use pyo3:: types:: PyAny ;
4
+ use pyo3:: types:: PyDict ;
4
5
use serde_json:: value:: Value ;
6
+ use serde_json:: Value ;
5
7
6
- use crate :: connection:: interface:: WrappedConnection ;
7
8
use super :: core:: { query, select} ;
9
+ use crate :: connection:: interface:: WrappedConnection ;
8
10
use crate :: py_future_wrapper;
9
11
10
12
@@ -18,15 +20,24 @@ use crate::py_future_wrapper;
18
20
/// # Returns
19
21
/// * `Ok(())` - The operation was successful
20
22
#[ pyfunction]
21
- pub fn rust_query_future < ' a > ( py : Python < ' a > , connection : WrappedConnection , sql : String , bindings : Option < & ' a PyAny > ) -> Result < & ' a PyAny , PyErr > {
23
+ pub fn rust_query_future < ' a > (
24
+ py : Python < ' a > ,
25
+ connection : WrappedConnection ,
26
+ sql : String ,
27
+ bindings : Option < & ' a PyDict > ,
28
+ ) -> Result < & ' a PyAny , PyErr > {
29
+ let processed_bindings = bindings
30
+ . map ( |dict| {
31
+ let value = dict. extract :: < Value > ( ) . map_err ( |e| {
32
+ PyErr :: new :: < pyo3:: exceptions:: PyValueError , _ > ( format ! (
33
+ "Failed to convert bindings to Value: {}" ,
34
+ e
35
+ ) )
36
+ } ) ?;
37
+ Ok ( value)
38
+ } )
39
+ . transpose ( ) ?;
22
40
23
- let processed_bindings = match bindings {
24
- Some ( bindings) => {
25
- let bindings: Value = serde_json:: from_str ( & bindings. to_string ( ) ) . map_err ( |e| PyErr :: new :: < pyo3:: exceptions:: PyRuntimeError , _ > ( e. to_string ( ) ) ) ?;
26
- Some ( bindings)
27
- } ,
28
- None => None
29
- } ;
30
41
py_future_wrapper ! ( py, query( connection, sql, processed_bindings) )
31
42
}
32
43
0 commit comments