File tree Expand file tree Collapse file tree
rust/src/declarative_asn1 Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -440,12 +440,7 @@ def value_set(
440440 their value; decoding fails if the decoded value does not match
441441 any member.
442442 """
443- try :
444- rust_type = declarative_asn1 .non_root_python_to_rust (value_type )
445- except TypeError :
446- raise TypeError (
447- f"unsupported value type for value set: { value_type !r} "
448- )
443+ rust_type = declarative_asn1 .non_root_python_to_rust (value_type )
449444
450445 def decorator (cls : type [U ]) -> type [U ]:
451446 if not issubclass (cls , enum .Enum ):
@@ -458,7 +453,7 @@ def decorator(cls: type[U]) -> type[U]:
458453 f"value set '{ cls .__name__ } ' must have at least one member"
459454 )
460455 for member in members :
461- if type (member .value ) is not value_type :
456+ if not isinstance (member .value , value_type ) :
462457 raise TypeError (
463458 f"member '{ member .name } ' of value set '{ cls .__name__ } ' "
464459 f"must have a value of type "
Original file line number Diff line number Diff line change @@ -266,6 +266,11 @@ fn decode_value_set<'a>(
266266) -> ParseResult < pyo3:: Bound < ' a , pyo3:: PyAny > > {
267267 let inner_ann_type = value_set_inner_type ( py, inner_type, annotation) ?;
268268 let decoded = decode_annotated_type ( py, parser, & inner_ann_type) ?;
269+ // NOTE: This is a linear scan over the members of the enum. If this
270+ // ever becomes a performance problem, it could be replaced with a
271+ // value -> member map stored in `Type::ValueSet` (keeping in mind
272+ // that hash-based lookups won't work for the asn1 wrapper types,
273+ // which implement `__eq__` but not `__hash__`).
269274 for member in cls. bind ( py) . try_iter ( ) ? {
270275 let member = member?;
271276 if member. getattr ( pyo3:: intern!( py, "value" ) ) ?. eq ( & decoded) ? {
Original file line number Diff line number Diff line change @@ -572,6 +572,6 @@ class Example(enum.Enum):
572572 def test_fail_unsupported_value_type (self ) -> None :
573573 with pytest .raises (
574574 TypeError ,
575- match = "unsupported value type for value set " ,
575+ match = "cannot handle type" ,
576576 ):
577577 asn1 .value_set (float )
You can’t perform that action at this time.
0 commit comments