Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "const-oid: add ObjectIdentifierRef; use for db (#1212)" #1299

Merged
merged 1 commit into from
Jan 4, 2024

Conversation

tarcieri
Copy link
Member

@tarcieri tarcieri commented Jan 4, 2024

This reverts commit 2f6303b.

Per #1293 to keep the ergonomics of the v0.9 release we need derived Eq/PartialEq impls which allow the constants to be used in match expressions.

That's not really possible with the generic backing storage approach that the v0.10 prereleases have been trying, and also precludes comparing OIDs with different backing storages.

While an ObjectIdentifierRef is still worth experimenting with, it's clear it isn't ready for prime time yet, so this begins the process of backing out some changes so the database isn't yet dependent on its existence.

This reverts commit 2f6303b.

Per #1293 to keep the ergonomics of the v0.9 release we need derived
`Eq`/`PartialEq` impls which allow the constants to be used in `match`
expressions.

That's not really possible with the generic backing storage approach
that the v0.10 prereleases have been trying, and also precludes
comparing OIDs with different backing storages.

While an `ObjectIdentifierRef` is still worth experimenting with, it's
clear it isn't ready for prime time yet, so this begins the process of
backing out some changes so the database isn't yet dependent on its
existence.
@tarcieri tarcieri merged commit afe505d into master Jan 4, 2024
107 checks passed
@tarcieri tarcieri deleted the const-oid/revert-db-changes branch January 4, 2024 22:47
tarcieri added a commit that referenced this pull request Jan 4, 2024
Previously the v0.10-pre release series has attempted to make
`ObjectIdentifier` generic around a backing buffer containing the BER
encoding and bounded on `AsRef<[u8]>`.

This approach has a drawback though: we can't use derived
`PartialEq`/`Eq`, which means it isn't possible to use in `match`
expressions anymore, an ergonomics drawback noted in #1293, with the
implementation reverted in #1299.

An alternative way to go for what it was trying to implement: an
`ObjectIdentifierRef` backed by a `&[u8]` is to use a separate struct.
With that approach, there could be overlapping `PartialEq`/`Eq` impls
that would allow the two to be compared.

As a start towards going that route, this gets rid of the generic
backing buffer and opts instead to make the struct const generic around
its size with a default.
tarcieri added a commit that referenced this pull request Jan 4, 2024
Previously the v0.10-pre release series has attempted to make
`ObjectIdentifier` generic around a backing buffer containing the BER
encoding and bounded on `AsRef<[u8]>`.

This approach has a drawback though: we can't use derived
`PartialEq`/`Eq`, which means it isn't possible to use in `match`
expressions anymore, an ergonomics drawback noted in #1293, with the
implementation reverted in #1299.

An alternative way to go for what it was trying to implement: an
`ObjectIdentifierRef` backed by a `&[u8]` is to use a separate struct.
With that approach, there could be overlapping `PartialEq`/`Eq` impls
that would allow the two to be compared.

As a start towards going that route, this gets rid of the generic
backing buffer and opts instead to make the struct const generic around
its size with a default.
tarcieri added a commit that referenced this pull request Jan 5, 2024
Adds a `repr(transparent)` newtype for a `[u8]` which is guaranteed to
contain a valid BER serialization of an OID. This is a similar approach
to how `Path`/`PathBuf` or `OsStr`/`OsString` work (except with
`ObjectIdentifier` being stack-allocated instead of heap allocated).

An unsafe pointer cast is required to go from `&[u8]` to
`&ObjectIdentifierRef`, so unfortunately this means the crate is no
longer `forbid(unsafe_code)`, however it's been lowered to
`deny(unsafe_code)` to ensure contributors think twice before adding
more.

`Borrow` and `Deref` impls have been added to the owned
`ObjectIdentifier` type, allowing common functionality to be moved to
`ObjectIdentifierRef`, allowing both types to exist while eliminating
code duplication.

A `PartialEq` impl allows them to be compared.

The `db` module continues to use `ObjectIdentifier` for now, however
hopefully this approach would allow #1212 to be reinstated and for
`ObjectIdentifierRef`s to be used for the database eventually (i.e.
revert the revert in #1299)
tarcieri added a commit that referenced this pull request Jan 5, 2024
Adds a `repr(transparent)` newtype for a `[u8]` which is guaranteed to
contain a valid BER serialization of an OID. This is a similar approach
to how `Path`/`PathBuf` or `OsStr`/`OsString` work (except with
`ObjectIdentifier` being stack-allocated instead of heap allocated).

An unsafe pointer cast is required to go from `&[u8]` to
`&ObjectIdentifierRef`, so unfortunately this means the crate is no
longer `forbid(unsafe_code)`, however it's been lowered to
`deny(unsafe_code)` to ensure contributors think twice before adding
more.

`Borrow` and `Deref` impls have been added to the owned
`ObjectIdentifier` type, allowing common functionality to be moved to
`ObjectIdentifierRef`, allowing both types to exist while eliminating
code duplication.

A `PartialEq` impl allows them to be compared.

The `db` module continues to use `ObjectIdentifier` for now, however
hopefully this approach would allow #1212 to be reinstated and for
`ObjectIdentifierRef`s to be used for the database eventually (i.e.
revert the revert in #1299)

NOTE: this PR also relaxes the previous requirement that an OID have at
least three arcs. It is now allowed to only have two.
tarcieri added a commit that referenced this pull request Jan 5, 2024
Adds a `repr(transparent)` newtype for a `[u8]` which is guaranteed to
contain a valid BER serialization of an OID. This is a similar approach
to how `Path`/`PathBuf` or `OsStr`/`OsString` work (except with
`ObjectIdentifier` being stack-allocated instead of heap allocated).

An unsafe pointer cast is required to go from `&[u8]` to
`&ObjectIdentifierRef`, so unfortunately this means the crate is no
longer `forbid(unsafe_code)`, however it's been lowered to
`deny(unsafe_code)` to ensure contributors think twice before adding
more.

`Borrow` and `Deref` impls have been added to the owned
`ObjectIdentifier` type, allowing common functionality to be moved to
`ObjectIdentifierRef`, allowing both types to exist while eliminating
code duplication.

A `PartialEq` impl allows them to be compared.

The `db` module continues to use `ObjectIdentifier` for now, however
hopefully this approach would allow #1212 to be reinstated and for
`ObjectIdentifierRef`s to be used for the database eventually (i.e.
revert the revert in #1299)

NOTE: this PR also relaxes the previous requirement that an OID have at
least three arcs. It is now allowed to only have two.
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