1
1
use super :: DecodeError as SerdeDecodeError ;
2
2
use crate :: {
3
3
config:: Config ,
4
- de:: { read:: Reader , Decode , Decoder } ,
4
+ de:: { read:: Reader , Decode , Decoder , DecoderImpl } ,
5
5
error:: DecodeError ,
6
+ IoReader ,
6
7
} ;
7
8
use serde:: de:: * ;
8
9
10
+ use super :: de_borrowed:: borrow_decode_from_slice;
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
+
9
53
/// Attempt to decode a given type `D` from the given slice. Returns the decoded output and the amount of bytes read.
10
54
///
11
55
/// Note that this does not work with borrowed types like `&str` or `&[u8]`. For that use [borrow_decode_from_slice].
19
63
D : DeserializeOwned ,
20
64
C : Config ,
21
65
{
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)
28
67
}
29
68
30
69
/// 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
34
73
/// [config]: ../config/index.html
35
74
#[ cfg( feature = "std" ) ]
36
75
#[ 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 ,
39
78
config : C ,
40
79
) -> 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 ( ) )
45
83
}
46
84
47
85
/// 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>(
53
91
reader : R ,
54
92
config : C ,
55
93
) -> 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 ( ) )
59
96
}
60
97
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 ,
63
100
}
64
101
65
102
impl < ' a , ' de , DE : Decoder > Deserializer < ' de > for SerdeDecoder < ' a , DE > {
0 commit comments