-
-
Notifications
You must be signed in to change notification settings - Fork 63
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
Partially seal error types. #277
Conversation
@partim: I get the point of this change, and understand how the hiding works when an enum variant has a public inner value but whose construction is private and thus only possible from within the crate code itself, and that for variants that can't be acted upon but merely need to be communicated handle this via a Display impl on the private type. What I don't get is why things like |
It blocks users from creating values other than through calling functions that return them. The reason for this is that it allows us later to change the type definition without it being a breaking change. (E.g., we might want to also use an inner enum.) |
Ah because that inner unit field is private, which is hard to see at a glance when using a unit struct. Thanks. |
Breaking changes * All types and functions referring to domain names have been changed from using the term “dname” to just “name.” For instance, `Dname` has become `Name`, `ToDname` has become `ToName`, and `ToDname::to_dname` has become `ToName::to_name`. ([#290]) * The `ToName` and `ToRelativeName` traits have been changed to have a pair of methods a la `try_to_name` and `to_name` for octets builders with limited and unlimited buffers, reflecting the pattern used elsewhere. ([#285]) * The types for IANA-registered parameters in `base::iana` have been changed from enums to a newtypes around their underlying integer type and associated constants for the registered values. (This was really always the better way to structure this.) ([#276], [#298]) * The `Txt` record data type now rejects empty record data as invalid. As a consequence `TxtBuilder` converts an empty builder into TXT record data consisting of one empty character string which requires `TxtBuilder::finish` to be able to return an error. ([#267]) * `Txt` record data serialization has been redesigned. It now serialized as a sequence of character strings. It also deserializes from such a sequence. If supported by the format, it alternatively deserializes from a string that is broken up into 255 octet chunks if necessary. ([#268]) * The text formatting for `CharStr` has been redesigned. The `Display` impl now uses a modified version of the representation format that doesn’t escape white space but also doesn’t enclose the string in quotes. Methods for explicitly formatting in quoted and unquoted presentation format are provided. ([#270]) * The `validate::RrsigExt` trait now accepts anything that impls `AsRef<Record<..>>` to allow the use of smart pointers. ([#288] by [@hunts]) * The stub resolver now uses the new client transports. This doesn’t change how it is used but does change how it queries the configured servers. ([#215]) * The sub resolver’s server configuration `Transport` type has been changed to be either `Transport::UdpTcp` for trying UDP and if that leads to a truncated answer try TCP and `Transport::Tcp` for only trying TCP. The stub resolver uses these accordingly now ([#296]) * Many error types have been changed from enums to structs that hide internal error details. Enums have been kept for errors where distinguishing variants might be meaningful for dealing with the error. ([#277]) * Renamed `Dnskey::is_zsk` to `is_zone_key`. ([#292]) * Split RRSIG timestamp handling from `Serial` into a new type `rdata::dnssec::Timestamp`. ([#294]) * Upgraded `octseq` to 0.5. ([#257]) * The minimum Rust version is now 1.70. ([#304]) New * Add impls for `AsRef<RelativeDname<[u8]>>` and `Borrow<RelativeDname<[u8]>>` to `RelativeDname<_>`. ([#251] by [@torin-carey]) * Added `name::Chain::fmt_with_dots` to format an absolute chained name with a final dot. ([#253]) * Added a new `ParseAnyRecordData` trait for record data types that can parse any type of record data. ([#256]) * Added implementations of `OctetsFrom` and `Debug` to `AllOptData` and the specific options types that didn’t have them yet. ([#257]) * Added missing ordering impls to `ZoneRecordData`, `AllRecordData`, `Opt`, and `SvcbRdata`. ([#293]) * Added `Name::reverse_from_addr` that creates a domain name for the reverse lookup of an IP address. ([#289]) * Added `OptBuilder::clone_from` to replace the OPT record with the content of another OPT record. ([#299]) * Added `Message::for_slice_ref` that returns a `Message<&[u8]>`. ([#300]) Bug fixes * Fixed the display implementation of `name::Chain<_, _>`. ([#253]) * Fixed the display implementation of `rdata::Txt<..>`. It now displays each embedded character string separately in quoted form. ([#259]) * Fixed the extended part returned by `OptRcode::to_parts` (it was shifted by 4 bits too many) and return all 12 bits for the `Int` variant in `OptRcode::to_int`. ([#258]) * Fixed a bug in the `inplace` zonefile parser that made it reject character string of length 255. ([#284]) Unstable features * Added the module `net::client` with experimental support for client message transport, i.e., sending of requests and receiving responses as well as caching of responses. This is gated by the `unstable-client-transport` feature. ([#215],[#275]) * Added the module `net::server` with experimental support for server transports, processing requests through a middleware chain and a service trait. This is gated by the `unstable-server-transport` feature. ([#274]) * Added the module `zonetree` providing basic traits representing a collection of zones and their data. The `zonetree::in_memory` module provides an in-memory implementation. The `zonetree::parsed` module provides a way to classify RRsets before inserting them into a tree. This is gated by the `unstable-zonetree` feature. ([#286])
This PR looks at all the error types and splits them into meaningful error information, which will be available as enum variants, and internals, which will be hidden away behind opaque structs. For the former case, we will still use enums directly rather than have error kind enums. These will not be non-exhaustive since they should really cover all possible cases and exhaustive matching should work.
This is a breaking change.
Fixes #141