-
Notifications
You must be signed in to change notification settings - Fork 84
Description
Describe the bug
PR #98 introduced a breaking change to the public ZipWriter::finish()
method. It now consumes self
rather than taking a mutable reference to self.
To Reproduce
Given something like the following, upgrading from 1.1.4 to 1.2.0 breaks the build.
struct Zipper {
zip: ZipWriter<Cursor<Vec<u8>>>,
// other stuff
}
impl Zipper {
pub(super) fn finish(&mut self) -> Result<Cursor<Vec<u8>>, zip::result::ZipError> {
self.zip.finish()
}
}
error[E0507]: cannot move out of `self.zip` which is behind a mutable reference
--> zipper.rs:58:9
|
58 | self.zip.finish()
| ^^^^^^^^ -------- `self.zip` moved due to this method call
| |
| move occurs because `self.zip` has type `ZipWriter<std::io::Cursor<Vec<u8>>>`, which does not implement the `Copy` trait
|
note: `zip::write::<impl ZipWriter<W>>::finish` takes ownership of the receiver `self`, which moves `self.zip`
--> /home/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/zip-1.2.3/src/write.rs:1312:23
|
1312 | pub fn finish(mut self) -> ZipResult<W> {
| ^^^^
Expected behavior
Semver compatible updates shouldn't fail the build.
Additional context
This was very easy to fix in my application, as I could just change the &mut self
to self
since nothing uses the encapsulating struct after calling finish
. But other applications may be more difficult to refactor and this results in unexpected breakage when running cargo update
against a codebase.
Ideally, this change would be deferred until a 2.0.0 release (reverting this change in a 1.2.4 release and/or yanking 1.2.0 through 1.2.3).