@@ -7,7 +7,7 @@ use pyo3::exceptions::PyValueError;
77use pyo3:: prelude:: * ;
88
99use chrono:: { DateTime , Duration as ChronoDuration , Offset , TimeZone , Utc } ;
10- use pyo3:: types:: { PyBytes , PyDateTime , PyDict , PyList , PyTuple } ;
10+ use pyo3:: types:: { PyBytes , PyDateTime , PyDict , PyList , PyNone , PyTuple } ;
1111use pyo3:: types:: { PyDelta , PyFunction } ;
1212use std:: time:: { Duration , SystemTime , UNIX_EPOCH } ;
1313
@@ -98,7 +98,9 @@ impl TryIntoValue for RustyPyType<'_> {
9898 fn try_into_value ( self ) -> Result < Value , Self :: Error > {
9999 let val = match self {
100100 RustyPyType ( pyobject) => {
101- if let Ok ( value) = pyobject. extract :: < bool > ( ) {
101+ if pyobject. is_none ( ) {
102+ Ok ( Value :: Null )
103+ } else if let Ok ( value) = pyobject. extract :: < bool > ( ) {
102104 Ok ( Value :: Bool ( value) )
103105 } else if let Ok ( value) = pyobject. extract :: < i64 > ( ) {
104106 Ok ( Value :: Int ( value) )
@@ -140,7 +142,11 @@ impl TryIntoValue for RustyPyType<'_> {
140142 } else if let Ok ( value) = pyobject. downcast :: < PyDict > ( ) {
141143 let mut map: HashMap < Key , Value > = HashMap :: new ( ) ;
142144 for ( key, value) in value. into_iter ( ) {
143- let key = if let Ok ( k) = key. extract :: < i64 > ( ) {
145+ let key = if key. is_none ( ) {
146+ return Err ( CelError :: ConversionError (
147+ "None cannot be used as a key in dictionaries" . to_string ( ) ,
148+ ) ) ;
149+ } else if let Ok ( k) = key. extract :: < i64 > ( ) {
144150 Key :: Int ( k)
145151 } else if let Ok ( k) = key. extract :: < u64 > ( ) {
146152 Key :: Uint ( k)
0 commit comments