@@ -3,6 +3,7 @@ use pyo3::prelude::*;
33use pyo3:: pyclass:: CompareOp ;
44use pyo3:: types:: * ;
55use std:: borrow:: Cow ;
6+ use std:: collections:: BTreeMap ;
67use std:: hash:: { Hash , Hasher } ;
78use std:: ops:: FnOnce ;
89use std:: sync:: { Arc , RwLock } ;
@@ -299,6 +300,14 @@ pub(crate) fn datavalue_from_py<'py>(value: Bound<'py, PyAny>) -> Result<DataVal
299300 list. push ( pyitem) ;
300301 }
301302 return Ok ( DataValue :: List ( list) ) ;
303+ } else if value. is_instance_of :: < PyDict > ( ) {
304+ let value: & Bound < ' py , PyDict > = value. downcast ( ) . expect ( "downcast must succeed" ) ;
305+ let mut map: BTreeMap < String , DataValue > = BTreeMap :: new ( ) ;
306+ for ( key, item) in value. iter ( ) {
307+ let pyitem = datavalue_from_py ( item) ?;
308+ map. insert ( key. to_string ( ) , pyitem) ;
309+ }
310+ return Ok ( DataValue :: Map ( map) ) ;
302311 }
303312 Err ( StamError :: OtherError (
304313 "Can't convert supplied Python object to a DataValue" ,
@@ -333,6 +342,14 @@ pub(crate) fn datavalue_into_py<'py>(
333342 }
334343 Ok ( pylist. into_any ( ) )
335344 }
345+ DataValue :: Map ( v) => {
346+ let pydict = PyDict :: new ( py) ;
347+ for ( key, value) in v. iter ( ) {
348+ let pyvalue = datavalue_into_py ( value, py) ?;
349+ pydict. add ( ( key, pyvalue) ) . expect ( "adding value to dict" ) ;
350+ }
351+ Ok ( pydict. into_any ( ) )
352+ }
336353 }
337354}
338355
0 commit comments