Skip to content

fix: decode unknown enum values instead of failing - #10

Merged
kafkiansky merged 1 commit into
0.2.xfrom
fixes/open-enums
Sep 29, 2026
Merged

kafkiansky merged 1 commit into
0.2.xfrom
fixes/open-enums

Conversation

@kafkiansky

Copy link
Copy Markdown
Contributor

Proto3 enums are open, but PHP enums are closed: an enum number without a matching case made BackedEnum::from() throw, and the whole message failed to decode. Such numbers are now handled the way protobuf handles closed enums: a singular field (or a oneof variant) is left unset, a repeated field keeps only the known values in order, and every unknown number is kept among the message's unknown fields as a varint with the field's number. A map entry with an unknown enum value is dropped, as the map decoder already drops incomplete entries.

Enum numbers are also read as int32 now: negative values, which arrive sign-extended to 64 bits, used to be cast to int directly and broke.

Proto3 enums are open, but PHP enums are closed: an enum number without a
matching case made BackedEnum::from() throw, and the whole message failed
to decode. Such numbers are now handled the way protobuf handles closed
enums: a singular field (or a oneof variant) is left unset, a repeated
field keeps only the known values in order, and every unknown number is
kept among the message's unknown fields as a varint with the field's
number. A map entry with an unknown enum value is dropped, as the map
decoder already drops incomplete entries.

Enum numbers are also read as int32 now: negative values, which arrive
sign-extended to 64 bits, used to be cast to int directly and broke.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kafkiansky
kafkiansky merged commit d97d325 into 0.2.x Sep 29, 2026
6 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant