Skip to content

Commit 8804cc6

Browse files
committed
Simplify lifetimes
Since `&'a mut R` is `Read` (or `Write`) when `R` is `Read` (resp. `Write`), there is no need to depend on `<R: ?Sized + Read> &'a mut R` over just plain `<R: Read> R`. The caller can still instantiate `R = &'a mut R_` when a reference is desired (and indeed this is done here for e.g. `MapDeserializer`).
1 parent 1d03bda commit 8804cc6

4 files changed

Lines changed: 66 additions & 61 deletions

File tree

src/de.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -143,19 +143,19 @@ struct Deserializer<R> {
143143
max_remaining_depth: usize,
144144
}
145145

146-
impl<'de, R: Read> Deserializer<TeeReader<'de, R>> {
147-
fn from_reader(input: &'de mut R, max_remaining_depth: usize) -> Self {
146+
impl<R: Read> Deserializer<TeeReader<R>> {
147+
fn from_reader(input: R, max_remaining_depth: usize) -> Self {
148148
Deserializer {
149149
input: TeeReader::new(input),
150150
max_remaining_depth,
151151
}
152152
}
153153
}
154154

155-
impl<'de> Deserializer<&'de [u8]> {
155+
impl<R> Deserializer<R> {
156156
/// Creates a new `Deserializer` which will be deserializing the provided
157157
/// input.
158-
fn new(input: &'de [u8], max_remaining_depth: usize) -> Self {
158+
fn new(input: R, max_remaining_depth: usize) -> Self {
159159
Deserializer {
160160
input,
161161
max_remaining_depth,
@@ -164,24 +164,24 @@ impl<'de> Deserializer<&'de [u8]> {
164164
}
165165

166166
/// A reader that can optionally capture all bytes from an underlying [`Read`]er
167-
struct TeeReader<'de, R> {
167+
struct TeeReader<R> {
168168
/// the underlying reader
169-
reader: &'de mut R,
169+
reader: R,
170170
/// If non-empty, all bytes read from the underlying reader will be captured in the last entry here.
171171
captured_keys: Vec<Vec<u8>>,
172172
}
173173

174-
impl<'de, R> TeeReader<'de, R> {
174+
impl<R> TeeReader<R> {
175175
/// Wraps the provided reader in a new [`TeeReader`].
176-
pub fn new(reader: &'de mut R) -> Self {
176+
pub fn new(reader: R) -> Self {
177177
Self {
178178
reader,
179179
captured_keys: Vec::new(),
180180
}
181181
}
182182
}
183183

184-
impl<'de, R: Read> Read for TeeReader<'de, R> {
184+
impl<R: Read> Read for TeeReader<R> {
185185
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
186186
let bytes_read = self.reader.read(buf)?;
187187
if let Some(buffer) = self.captured_keys.last_mut() {
@@ -289,7 +289,7 @@ trait BcsDeserializer<'de> {
289289
}
290290
}
291291

292-
impl<'de, R: Read> Deserializer<TeeReader<'de, R>> {
292+
impl<R: Read> Deserializer<TeeReader<R>> {
293293
fn parse_vec(&mut self) -> Result<Vec<u8>> {
294294
let len = self.parse_length()?;
295295
let mut output = vec![0; len];
@@ -303,7 +303,7 @@ impl<'de, R: Read> Deserializer<TeeReader<'de, R>> {
303303
}
304304
}
305305

306-
impl<'de, R: Read> BcsDeserializer<'de> for Deserializer<TeeReader<'de, R>> {
306+
impl<'de, R: Read> BcsDeserializer<'de> for Deserializer<TeeReader<R>> {
307307
type MaybeBorrowedBytes = Vec<u8>;
308308

309309
fn fill_slice(&mut self, slice: &mut [u8]) -> Result<()> {
@@ -428,7 +428,7 @@ impl<R> Deserializer<R> {
428428
}
429429
}
430430

431-
impl<'de, 'a, R> de::Deserializer<'de> for &'a mut Deserializer<R>
431+
impl<'de, R> de::Deserializer<'de> for &mut Deserializer<R>
432432
where
433433
Deserializer<R>: BcsDeserializer<'de>,
434434
{
@@ -786,7 +786,7 @@ where
786786
}
787787
}
788788

789-
impl<'de, 'a, R> de::EnumAccess<'de> for &'a mut Deserializer<R>
789+
impl<'de, R> de::EnumAccess<'de> for &mut Deserializer<R>
790790
where
791791
Deserializer<R>: BcsDeserializer<'de>,
792792
{
@@ -803,7 +803,7 @@ where
803803
}
804804
}
805805

806-
impl<'de, 'a, R> de::VariantAccess<'de> for &'a mut Deserializer<R>
806+
impl<'de, R> de::VariantAccess<'de> for &mut Deserializer<R>
807807
where
808808
Deserializer<R>: BcsDeserializer<'de>,
809809
{

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//! * provide good performance and concise (binary) representations;
1313
//! * support a rich set of data types commonly used in Rust;
1414
//! * enforce canonical serialization, meaning that every value of a given type should have
15-
//! a single valid representation.
15+
//! a single valid representation.
1616
//!
1717
//! BCS also aims to mitigate the consequence of malicious inputs by enforcing well-defined limits
1818
//! on large or nested containers during (de)serialization.
@@ -44,7 +44,7 @@
4444
//! applications must carefully plan in advance for adhoc extension points:
4545
//! * Enums may be used for explicit versioning and backward compatibility (e.g. extensible query interfaces).
4646
//! * In some cases, data fields of type `Vec<u8>` may also be added to allow (future) unknown payloads
47-
//! in serialized form.
47+
//! in serialized form.
4848
//!
4949
//! ## Detailed Specifications
5050
//!

src/ser.rs

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
// Copyright (c) The Diem Core Contributors
22
// SPDX-License-Identifier: Apache-2.0
33

4+
// `Error::other` doesn't exist on the MSRV.
5+
#![allow(clippy::io_other_error)]
6+
47
use crate::error::{Error, Result};
58
use serde::{ser, Serialize};
69

@@ -70,26 +73,28 @@ where
7073
}
7174

7275
/// Same as `to_bytes` but write directly into an `std::io::Write` object.
73-
pub fn serialize_into<W, T>(write: &mut W, value: &T) -> Result<()>
76+
pub fn serialize_into<T>(mut write: impl std::io::Write, value: &T) -> Result<()>
7477
where
75-
W: ?Sized + std::io::Write,
7678
T: ?Sized + Serialize,
7779
{
78-
let serializer = Serializer::new(write, crate::MAX_CONTAINER_DEPTH);
80+
let serializer = Serializer::new(&mut write, crate::MAX_CONTAINER_DEPTH);
7981
value.serialize(serializer)
8082
}
8183

8284
/// Same as `serialize_into` but use `limit` as max container depth instead of MAX_CONTAINER_DEPTH
8385
/// Note that `limit` has to be lower than MAX_CONTAINER_DEPTH
84-
pub fn serialize_into_with_limit<W, T>(write: &mut W, value: &T, limit: usize) -> Result<()>
86+
pub fn serialize_into_with_limit<T>(
87+
mut write: impl std::io::Write,
88+
value: &T,
89+
limit: usize,
90+
) -> Result<()>
8591
where
86-
W: ?Sized + std::io::Write,
8792
T: ?Sized + Serialize,
8893
{
8994
if limit > crate::MAX_CONTAINER_DEPTH {
9095
return Err(Error::NotSupported("limit exceeds the max allowed depth"));
9196
}
92-
let serializer = Serializer::new(write, limit);
97+
let serializer = Serializer::new(&mut write, limit);
9398
value.serialize(serializer)
9499
}
95100

@@ -140,17 +145,17 @@ pub fn is_human_readable() -> bool {
140145
}
141146

142147
/// Serialization implementation for BCS
143-
struct Serializer<'a, W: ?Sized> {
144-
output: &'a mut W,
148+
struct Serializer<W> {
149+
output: W,
145150
max_remaining_depth: usize,
146151
}
147152

148-
impl<'a, W> Serializer<'a, W>
153+
impl<W> Serializer<W>
149154
where
150-
W: ?Sized + std::io::Write,
155+
W: std::io::Write,
151156
{
152157
/// Creates a new `Serializer` which will emit BCS.
153-
fn new(output: &'a mut W, max_remaining_depth: usize) -> Self {
158+
fn new(output: W, max_remaining_depth: usize) -> Self {
154159
Self {
155160
output,
156161
max_remaining_depth,
@@ -190,17 +195,17 @@ where
190195
}
191196
}
192197

193-
impl<'a, W> ser::Serializer for Serializer<'a, W>
198+
impl<'r, W> ser::Serializer for Serializer<&'r mut W>
194199
where
195-
W: ?Sized + std::io::Write,
200+
W: std::io::Write,
196201
{
197202
type Ok = ();
198203
type Error = Error;
199204
type SerializeSeq = Self;
200205
type SerializeTuple = Self;
201206
type SerializeTupleStruct = Self;
202207
type SerializeTupleVariant = Self;
203-
type SerializeMap = MapSerializer<'a, W>;
208+
type SerializeMap = MapSerializer<&'r mut W>;
204209
type SerializeStruct = Self;
205210
type SerializeStructVariant = Self;
206211

@@ -403,9 +408,9 @@ where
403408
}
404409
}
405410

406-
impl<'a, W> ser::SerializeSeq for Serializer<'a, W>
411+
impl<W> ser::SerializeSeq for Serializer<&mut W>
407412
where
408-
W: ?Sized + std::io::Write,
413+
W: std::io::Write,
409414
{
410415
type Ok = ();
411416
type Error = Error;
@@ -414,17 +419,17 @@ where
414419
where
415420
T: ?Sized + Serialize,
416421
{
417-
value.serialize(Serializer::new(self.output, self.max_remaining_depth))
422+
value.serialize(Serializer::new(&mut *self.output, self.max_remaining_depth))
418423
}
419424

420425
fn end(self) -> Result<()> {
421426
Ok(())
422427
}
423428
}
424429

425-
impl<'a, W> ser::SerializeTuple for Serializer<'a, W>
430+
impl<W> ser::SerializeTuple for Serializer<&mut W>
426431
where
427-
W: ?Sized + std::io::Write,
432+
W: std::io::Write,
428433
{
429434
type Ok = ();
430435
type Error = Error;
@@ -433,17 +438,17 @@ where
433438
where
434439
T: ?Sized + Serialize,
435440
{
436-
value.serialize(Serializer::new(self.output, self.max_remaining_depth))
441+
value.serialize(Serializer::new(&mut *self.output, self.max_remaining_depth))
437442
}
438443

439444
fn end(self) -> Result<()> {
440445
Ok(())
441446
}
442447
}
443448

444-
impl<'a, W> ser::SerializeTupleStruct for Serializer<'a, W>
449+
impl<W> ser::SerializeTupleStruct for Serializer<&mut W>
445450
where
446-
W: ?Sized + std::io::Write,
451+
W: std::io::Write,
447452
{
448453
type Ok = ();
449454
type Error = Error;
@@ -452,17 +457,17 @@ where
452457
where
453458
T: ?Sized + Serialize,
454459
{
455-
value.serialize(Serializer::new(self.output, self.max_remaining_depth))
460+
value.serialize(Serializer::new(&mut *self.output, self.max_remaining_depth))
456461
}
457462

458463
fn end(self) -> Result<()> {
459464
Ok(())
460465
}
461466
}
462467

463-
impl<'a, W> ser::SerializeTupleVariant for Serializer<'a, W>
468+
impl<W> ser::SerializeTupleVariant for Serializer<&mut W>
464469
where
465-
W: ?Sized + std::io::Write,
470+
W: std::io::Write,
466471
{
467472
type Ok = ();
468473
type Error = Error;
@@ -471,7 +476,7 @@ where
471476
where
472477
T: ?Sized + Serialize,
473478
{
474-
value.serialize(Serializer::new(self.output, self.max_remaining_depth))
479+
value.serialize(Serializer::new(&mut *self.output, self.max_remaining_depth))
475480
}
476481

477482
fn end(self) -> Result<()> {
@@ -480,14 +485,14 @@ where
480485
}
481486

482487
#[doc(hidden)]
483-
struct MapSerializer<'a, W: ?Sized> {
484-
serializer: Serializer<'a, W>,
488+
pub struct MapSerializer<W> {
489+
serializer: Serializer<W>,
485490
entries: Vec<(Vec<u8>, Vec<u8>)>,
486491
next_key: Option<Vec<u8>>,
487492
}
488493

489-
impl<'a, W: ?Sized> MapSerializer<'a, W> {
490-
fn new(serializer: Serializer<'a, W>) -> Self {
494+
impl<W> MapSerializer<W> {
495+
fn new(serializer: Serializer<W>) -> Self {
491496
MapSerializer {
492497
serializer,
493498
entries: Vec::new(),
@@ -496,9 +501,9 @@ impl<'a, W: ?Sized> MapSerializer<'a, W> {
496501
}
497502
}
498503

499-
impl<'a, W> ser::SerializeMap for MapSerializer<'a, W>
504+
impl<W> ser::SerializeMap for MapSerializer<W>
500505
where
501-
W: ?Sized + std::io::Write,
506+
W: std::io::Write,
502507
{
503508
type Ok = ();
504509
type Error = Error;
@@ -557,9 +562,9 @@ where
557562
}
558563
}
559564

560-
impl<'a, W> ser::SerializeStruct for Serializer<'a, W>
565+
impl<W> ser::SerializeStruct for Serializer<&mut W>
561566
where
562-
W: ?Sized + std::io::Write,
567+
W: std::io::Write,
563568
{
564569
type Ok = ();
565570
type Error = Error;
@@ -568,17 +573,17 @@ where
568573
where
569574
T: ?Sized + Serialize,
570575
{
571-
value.serialize(Serializer::new(self.output, self.max_remaining_depth))
576+
value.serialize(Serializer::new(&mut *self.output, self.max_remaining_depth))
572577
}
573578

574579
fn end(self) -> Result<()> {
575580
Ok(())
576581
}
577582
}
578583

579-
impl<'a, W> ser::SerializeStructVariant for Serializer<'a, W>
584+
impl<W> ser::SerializeStructVariant for Serializer<&mut W>
580585
where
581-
W: ?Sized + std::io::Write,
586+
W: std::io::Write,
582587
{
583588
type Ok = ();
584589
type Error = Error;
@@ -587,7 +592,7 @@ where
587592
where
588593
T: ?Sized + Serialize,
589594
{
590-
value.serialize(Serializer::new(self.output, self.max_remaining_depth))
595+
value.serialize(Serializer::new(&mut *self.output, self.max_remaining_depth))
591596
}
592597

593598
fn end(self) -> Result<()> {

0 commit comments

Comments
 (0)