-
Notifications
You must be signed in to change notification settings - Fork 236
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
Implement Clone for error enums #521
Conversation
Cloneable errors seems not in a trend in Rust, it is unknown what the long-term consequences of this. I'm not totally against this PR, but I would like to hear what the situations where you need to clone errors? |
Thanks for the quick response and that's very fair. My own use case: I've a task that owns a socket and reads and parses messages from the socket and then forwards them to all interested parties (streams) through a broadcast channel. Since Please note that in my crate, I'm fixing the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm fine with replacing Error::Io(IoError)
to Error::Io(Arc<IoError>)
, which, I think, would be more elegant solution. We also can hide that under a feature flag (say, cloneable-errors
), but I think that this is not required (besides, that is anti-pattern, because that create a incompatible API depending on the feature flags, which should be avoided). @dralley, what to you think?
Whatever path we choose, it is important to describe it in the documentation for Error
, and add a changelog entry.
I think, that will resolve #360?
I completely agree. I will revise the commits after hearing opinion of @dralley.
For sure. I'll do that as part of the update. |
Not sure. single consumer APIs should not require cloning. |
I'm fine with |
bf171cc
to
8025695
Compare
@Mingun Updated the commits. PTALA. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
impl<E: Error> Error for Arc<E>
was implemented in Rust 1.52, so need to bump our MSRV. Please add a note about that to the Changelog, before "New Features" section
40e8e5f
to
003c7bc
Compare
We'll be making use `impl<E: Error> Error for Arc<E>` that was introduced in 1.52.
The `?` handles the tranformation for us.
This would allow using crates to embed errors from this crate into their error types that implement Clone. Unfortunately `std::io::Error` does not implement `Clone` [1] so we've to wrap it in an `Arc`.
003c7bc
to
661d117
Compare
Lol, apparently GH wants me to only request review from one person. :) Sorry about adding and removing dance. |
Thanks! |
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [quick-xml](https://github.com/tafia/quick-xml) | dependencies | minor | `0.26.0` -> `0.27.1` | --- ### Release Notes <details> <summary>tafia/quick-xml</summary> ### [`v0.27.1`](https://github.com/tafia/quick-xml/blob/HEAD/Changelog.md#​0271----2022-12-28) [Compare Source](tafia/quick-xml@v0.27.0...v0.27.1) ##### Bug Fixes - [#​530]: Fix an infinite loop leading to unbounded memory consumption that occurs when skipping events on malformed XML with the `overlapped-lists` feature active. - [#​530]: Fix an error in the `Deserializer::read_to_end` when `overlapped-lists` feature is active and malformed XML is parsed [#​530]: tafia/quick-xml#530 ### [`v0.27.0`](https://github.com/tafia/quick-xml/blob/HEAD/Changelog.md#​0270----2022-12-25) [Compare Source](tafia/quick-xml@v0.26.0...v0.27.0) ##### New Features - [#​521]: Implement `Clone` for all error types. This required changing `Error::Io` to contain `Arc<std::io::Error>` instead of `std::io::Error` since `std::io::Error` does not implement `Clone`. ##### Bug Fixes - [#​490]: Ensure that serialization of map keys always produces valid XML names. In particular, that means that maps with numeric and numeric-like keys (for example, `"42"`) no longer can be serialized because [XML name] cannot start from a digit - [#​500]: Fix deserialization of top-level sequences of enums, like ```xml <?xml version="1.0" encoding="UTF-8"?> <!-- list of enum Enum { A, B, С } --> <A/> <B/> <C/> ``` - [#​514]: Fix wrong reporting `Error::EndEventMismatch` after disabling and enabling `.check_end_names` - [#​517]: Fix swapped codes for `\r` and `\n` characters when escaping them - [#​523]: Fix incorrect skipping text and CDATA content before any map-like structures in serde deserializer, like ```xml unwanted text<struct>...</struct> ``` - [#​523]: Fix incorrect handling of `xs:list`s with encoded spaces: they still act as delimiters, which is confirmed also by mature XmlBeans Java library - [#​473]: Fix a hidden requirement to enable serde's `derive` feature to get quick-xml's `serialize` feature for `edition = 2021` or `resolver = 2` crates ##### Misc Changes - [#​490]: Removed `$unflatten=` special prefix for fields for serde (de)serializer, because: - it is useless for deserializer - serializer was rewritten and does not require it anymore This prefix allowed you to serialize struct field as an XML element and now replaced by a more thoughtful system explicitly indicating that a field should be serialized as an attribute by prepending `@` character to its name - [#​490]: Removed `$primitive=` prefix. That prefix allowed you to serialize struct field as an attribute instead of an element and now replaced by a more thoughtful system explicitly indicating that a field should be serialized as an attribute by prepending `@` character to its name - [#​490]: In addition to the `$value` special name for a field a new `$text` special name was added: - `$text` is used if you want to map field to text content only. No markup is expected (but text can represent a list as defined by `xs:list` type) - `$value` is used if you want to map elements with different names to one field, that should be represented either by an `enum`, or by sequence of `enum`s (`Vec`, tuple, etc.), or by string. Use it when you want to map field to any content of the field, text or markup Refer to [documentation] for details. - [#​521]: MSRV bumped to 1.52. - [#​473]: `serde` feature that used to make some types serializable, renamed to `serde-types` - [#​528]: Added documentation for XML to `serde` mapping [#​473]: tafia/quick-xml#473 [#​490]: tafia/quick-xml#490 [#​500]: tafia/quick-xml#500 [#​514]: tafia/quick-xml#514 [#​517]: tafia/quick-xml#517 [#​521]: tafia/quick-xml#521 [#​523]: tafia/quick-xml#523 [#​528]: tafia/quick-xml#528 [XML name]: https://www.w3.org/TR/xml11/#NT-Name [documentation]: https://docs.rs/quick-xml/0.27.0/quick_xml/de/index.html#difference-between-text-and-value-special-names </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC43My4wIiwidXBkYXRlZEluVmVyIjoiMzQuNzQuMiJ9--> Co-authored-by: cabr2-bot <cabr2.help@gmail.com> Co-authored-by: crapStone <crapstone01@gmail.com> Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1692 Reviewed-by: crapStone <crapstone@noreply.codeberg.org> Co-authored-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org> Co-committed-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
This would allow using crates to embed errors from this crate into their error types that implement Clone.
Unfortunately
std::io::Error
does not implementClone
so we've to loose some of its state during cloning. The most importat bit (error kind) is preserved though.