Skip to content

Commit 0b6e288

Browse files
committed
Address review feedback
- Don't wrap the non_root_python_to_rust exception in value_set - Allow subclasses of the declared value type (isinstance check) - Document why value set decoding uses a linear member scan https://claude.ai/code/session_01AbKLBGrHu13j6gKNpKGD2e
1 parent 1ad36a5 commit 0b6e288

3 files changed

Lines changed: 8 additions & 8 deletions

File tree

src/cryptography/hazmat/asn1/asn1.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff 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 "

src/rust/src/declarative_asn1/decode.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff 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)? {

tests/hazmat/asn1/test_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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)

0 commit comments

Comments
 (0)