Skip to content

Commit 1332236

Browse files
authored
Expose types implementing serde::Serializer and Deserializer (#729)
* Expose types implementing serde::Deserializer * Gate IoReader import
1 parent d8baf43 commit 1332236

File tree

2 files changed

+103
-42
lines changed

2 files changed

+103
-42
lines changed

src/features/serde/de_borrowed.rs

+47-23
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,48 @@
11
use super::DecodeError as SerdeDecodeError;
22
use crate::{
33
config::Config,
4-
de::{BorrowDecode, BorrowDecoder, Decode},
4+
de::{read::SliceReader, BorrowDecode, BorrowDecoder, Decode, DecoderImpl},
55
error::DecodeError,
66
};
77
use core::marker::PhantomData;
88
use serde::de::*;
99

10+
/// Serde decoder encapsulating a borrowed reader.
11+
pub struct BorrowedSerdeDecoder<'de, DE: BorrowDecoder<'de>> {
12+
pub(super) de: DE,
13+
pub(super) pd: PhantomData<&'de ()>,
14+
}
15+
16+
impl<'de, DE: BorrowDecoder<'de>> BorrowedSerdeDecoder<'de, DE> {
17+
/// Return a type implementing `serde::Deserializer`.
18+
pub fn as_deserializer<'a>(
19+
&'a mut self,
20+
) -> impl serde::Deserializer<'de, Error = DecodeError> + 'a {
21+
SerdeDecoder {
22+
de: &mut self.de,
23+
pd: PhantomData,
24+
}
25+
}
26+
}
27+
28+
impl<'de, C: Config> BorrowedSerdeDecoder<'de, DecoderImpl<SliceReader<'de>, C>> {
29+
/// Creates the decoder from a borrowed slice.
30+
pub fn from_slice(
31+
slice: &'de [u8],
32+
config: C,
33+
) -> BorrowedSerdeDecoder<'de, DecoderImpl<SliceReader<'de>, C>>
34+
where
35+
C: Config,
36+
{
37+
let reader = SliceReader::new(slice);
38+
let decoder = DecoderImpl::new(reader, config);
39+
Self {
40+
de: decoder,
41+
pd: PhantomData,
42+
}
43+
}
44+
}
45+
1046
/// Attempt to decode a given type `D` from the given slice. Returns the decoded output and the amount of bytes read.
1147
///
1248
/// See the [config](../config/index.html) module for more information on configurations.
@@ -18,14 +54,10 @@ where
1854
D: Deserialize<'de>,
1955
C: Config,
2056
{
21-
let reader = crate::de::read::SliceReader::new(slice);
22-
let mut decoder = crate::de::DecoderImpl::new(reader, config);
23-
let serde_decoder = SerdeDecoder {
24-
de: &mut decoder,
25-
pd: PhantomData,
26-
};
27-
let result = D::deserialize(serde_decoder)?;
28-
let bytes_read = slice.len() - decoder.borrow_reader().slice.len();
57+
let mut serde_decoder =
58+
BorrowedSerdeDecoder::<DecoderImpl<SliceReader<'de>, C>>::from_slice(slice, config);
59+
let result = D::deserialize(serde_decoder.as_deserializer())?;
60+
let bytes_read = slice.len() - serde_decoder.de.borrow_reader().slice.len();
2961
Ok((result, bytes_read))
3062
}
3163

@@ -36,13 +68,9 @@ where
3668
T: Deserialize<'de>,
3769
C: Config,
3870
{
39-
let reader = crate::de::read::SliceReader::new(slice);
40-
let mut decoder = crate::de::DecoderImpl::new(reader, config);
41-
let serde_decoder = SerdeDecoder {
42-
de: &mut decoder,
43-
pd: PhantomData,
44-
};
45-
T::deserialize(serde_decoder)
71+
let mut serde_decoder =
72+
BorrowedSerdeDecoder::<DecoderImpl<SliceReader<'de>, C>>::from_slice(slice, config);
73+
T::deserialize(serde_decoder.as_deserializer())
4674
}
4775

4876
/// Decode a borrowed type from the given slice using a seed. Some parts of the decoded type are expected to be referring to the given slice
@@ -55,13 +83,9 @@ where
5583
T: DeserializeSeed<'de>,
5684
C: Config,
5785
{
58-
let reader = crate::de::read::SliceReader::new(slice);
59-
let mut decoder = crate::de::DecoderImpl::new(reader, config);
60-
let serde_decoder = SerdeDecoder {
61-
de: &mut decoder,
62-
pd: PhantomData,
63-
};
64-
seed.deserialize(serde_decoder)
86+
let mut serde_decoder =
87+
BorrowedSerdeDecoder::<DecoderImpl<SliceReader<'de>, C>>::from_slice(slice, config);
88+
seed.deserialize(serde_decoder.as_deserializer())
6589
}
6690

6791
pub(super) struct SerdeDecoder<'a, 'de, DE: BorrowDecoder<'de>> {

src/features/serde/de_owned.rs

+56-19
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,55 @@
1-
use super::DecodeError as SerdeDecodeError;
1+
use super::{de_borrowed::borrow_decode_from_slice, DecodeError as SerdeDecodeError};
22
use crate::{
33
config::Config,
4-
de::{read::Reader, Decode, Decoder},
4+
de::{read::Reader, Decode, Decoder, DecoderImpl},
55
error::DecodeError,
66
};
77
use serde::de::*;
88

9+
#[cfg(feature = "std")]
10+
use crate::features::IoReader;
11+
12+
/// Serde decoder encapsulating an owned reader.
13+
pub struct OwnedSerdeDecoder<DE: Decoder> {
14+
pub(super) de: DE,
15+
}
16+
17+
impl<DE: Decoder> OwnedSerdeDecoder<DE> {
18+
/// Return a type implementing `serde::Deserializer`.
19+
pub fn as_deserializer<'a>(
20+
&'a mut self,
21+
) -> impl for<'de> serde::Deserializer<'de, Error = DecodeError> + 'a {
22+
SerdeDecoder { de: &mut self.de }
23+
}
24+
}
25+
26+
#[cfg(feature = "std")]
27+
impl<'r, C: Config, R: std::io::Read> OwnedSerdeDecoder<DecoderImpl<IoReader<&'r mut R>, C>> {
28+
/// Creates the decoder from an `std::io::Read` implementor.
29+
pub fn from_std_read(
30+
src: &'r mut R,
31+
config: C,
32+
) -> OwnedSerdeDecoder<DecoderImpl<IoReader<&'r mut R>, C>>
33+
where
34+
C: Config,
35+
{
36+
let reader = IoReader::new(src);
37+
let decoder = DecoderImpl::new(reader, config);
38+
Self { de: decoder }
39+
}
40+
}
41+
42+
impl<C: Config, R: Reader> OwnedSerdeDecoder<DecoderImpl<R, C>> {
43+
/// Creates the decoder from a [`Reader`] implementor.
44+
pub fn from_reader(reader: R, config: C) -> OwnedSerdeDecoder<DecoderImpl<R, C>>
45+
where
46+
C: Config,
47+
{
48+
let decoder = DecoderImpl::new(reader, config);
49+
Self { de: decoder }
50+
}
51+
}
52+
953
/// Attempt to decode a given type `D` from the given slice. Returns the decoded output and the amount of bytes read.
1054
///
1155
/// Note that this does not work with borrowed types like `&str` or `&[u8]`. For that use [borrow_decode_from_slice].
@@ -19,12 +63,7 @@ where
1963
D: DeserializeOwned,
2064
C: Config,
2165
{
22-
let reader = crate::de::read::SliceReader::new(slice);
23-
let mut decoder = crate::de::DecoderImpl::new(reader, config);
24-
let serde_decoder = SerdeDecoder { de: &mut decoder };
25-
let result = D::deserialize(serde_decoder)?;
26-
let bytes_read = slice.len() - decoder.reader().slice.len();
27-
Ok((result, bytes_read))
66+
borrow_decode_from_slice(slice, config)
2867
}
2968

3069
/// Decode type `D` from the given reader with the given `Config`. The reader can be any type that implements `std::io::Read`, e.g. `std::fs::File`.
@@ -34,14 +73,13 @@ where
3473
/// [config]: ../config/index.html
3574
#[cfg(feature = "std")]
3675
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
37-
pub fn decode_from_std_read<D: DeserializeOwned, C: Config, R: std::io::Read>(
38-
src: &mut R,
76+
pub fn decode_from_std_read<'r, D: DeserializeOwned, C: Config, R: std::io::Read>(
77+
src: &'r mut R,
3978
config: C,
4079
) -> Result<D, DecodeError> {
41-
let reader = crate::IoReader::new(src);
42-
let mut decoder = crate::de::DecoderImpl::new(reader, config);
43-
let serde_decoder = SerdeDecoder { de: &mut decoder };
44-
D::deserialize(serde_decoder)
80+
let mut serde_decoder =
81+
OwnedSerdeDecoder::<DecoderImpl<IoReader<&'r mut R>, C>>::from_std_read(src, config);
82+
D::deserialize(serde_decoder.as_deserializer())
4583
}
4684

4785
/// Attempt to decode a given type `D` from the given [Reader].
@@ -53,13 +91,12 @@ pub fn decode_from_reader<D: DeserializeOwned, R: Reader, C: Config>(
5391
reader: R,
5492
config: C,
5593
) -> Result<D, DecodeError> {
56-
let mut decoder = crate::de::DecoderImpl::<_, C>::new(reader, config);
57-
let serde_decoder = SerdeDecoder { de: &mut decoder };
58-
D::deserialize(serde_decoder)
94+
let mut serde_decoder = OwnedSerdeDecoder::<DecoderImpl<R, C>>::from_reader(reader, config);
95+
D::deserialize(serde_decoder.as_deserializer())
5996
}
6097

61-
pub(crate) struct SerdeDecoder<'a, DE: Decoder> {
62-
pub(crate) de: &'a mut DE,
98+
pub(super) struct SerdeDecoder<'a, DE: Decoder> {
99+
pub(super) de: &'a mut DE,
63100
}
64101

65102
impl<'de, DE: Decoder> Deserializer<'de> for SerdeDecoder<'_, DE> {

0 commit comments

Comments
 (0)