@@ -8,7 +8,7 @@ pub use error::Error;
8
8
9
9
use alloc:: { string:: String , vec:: Vec } ;
10
10
11
- use ciborium_io:: Read ;
11
+ use ciborium_io:: { eof , Read } ;
12
12
use ciborium_ll:: * ;
13
13
use serde:: {
14
14
de:: { self , value:: BytesDeserializer , Deserializer as _} ,
@@ -48,14 +48,103 @@ impl<E: de::Error> Expected<E> for Header {
48
48
}
49
49
}
50
50
51
+ enum Reference < ' b , ' c , T : ?Sized + ' static > {
52
+ Borrowed ( & ' b T ) ,
53
+ Copied ( & ' c T ) ,
54
+ }
55
+
56
+ trait ReadSlice < ' de > : Read {
57
+ fn read_slice < ' a > ( & ' a mut self , len : usize ) -> Result < Reference < ' de , ' a , [ u8 ] > , Self :: Error > ;
58
+ }
59
+
60
+ /// TODO
61
+ pub struct Reader < R > {
62
+ r : R ,
63
+ buf : Vec < u8 > ,
64
+ }
65
+
66
+ impl < R > Reader < R > {
67
+ fn new ( r : R ) -> Self {
68
+ Self {
69
+ r,
70
+ buf : Vec :: with_capacity ( 128 ) ,
71
+ }
72
+ }
73
+ }
74
+
75
+ impl < R : Read > Read for Reader < R > {
76
+ type Error = R :: Error ;
77
+
78
+ fn read_exact ( & mut self , data : & mut [ u8 ] ) -> Result < ( ) , Self :: Error > {
79
+ self . r . read_exact ( data)
80
+ }
81
+ }
82
+
83
+ impl < ' de , R : Read > ReadSlice < ' de > for Reader < R > {
84
+ fn read_slice < ' a > ( & ' a mut self , len : usize ) -> Result < Reference < ' de , ' a , [ u8 ] > , Self :: Error > {
85
+ self . buf . resize ( len, 0 ) ;
86
+ self . r . read_exact ( & mut self . buf ) ?;
87
+ Ok ( Reference :: Copied ( & self . buf [ ..] ) )
88
+ }
89
+ }
90
+
91
+ /// TODO
92
+ pub struct SliceReader < ' de > {
93
+ _slice : & ' de [ u8 ] ,
94
+ buf : & ' de [ u8 ] ,
95
+ }
96
+
97
+ impl < ' de > SliceReader < ' de > {
98
+ fn new ( r : & ' de [ u8 ] ) -> Self {
99
+ Self { _slice : r, buf : r }
100
+ }
101
+ }
102
+
103
+ impl < ' de > Read for SliceReader < ' de > {
104
+ type Error = <& ' de [ u8 ] as ciborium_io:: Read >:: Error ;
105
+
106
+ fn read_exact ( & mut self , data : & mut [ u8 ] ) -> Result < ( ) , Self :: Error > {
107
+ self . buf . read_exact ( data)
108
+ }
109
+ }
110
+
111
+ impl < ' de > ReadSlice < ' de > for SliceReader < ' de > {
112
+ fn read_slice < ' a > ( & ' a mut self , len : usize ) -> Result < Reference < ' de , ' a , [ u8 ] > , Self :: Error > {
113
+ if len > self . buf . len ( ) {
114
+ return Err ( eof ( ) ) ;
115
+ }
116
+ let ( a, b) = self . buf . split_at ( len) ;
117
+ self . buf = b;
118
+ Ok ( Reference :: Borrowed ( a) )
119
+ }
120
+ }
121
+
51
122
/// Deserializer
52
123
pub struct Deserializer < ' b , R > {
53
124
decoder : Decoder < R > ,
54
125
scratch : & ' b mut [ u8 ] ,
55
126
recurse : usize ,
56
127
}
57
128
58
- fn noop ( _: u8 ) { }
129
+ impl < ' a , R : Read > Deserializer < ' a , Reader < R > > {
130
+ fn from_reader ( r : R , scratch : & ' a mut [ u8 ] , recurse : usize ) -> Self {
131
+ Self {
132
+ decoder : Reader :: new ( r) . into ( ) ,
133
+ scratch,
134
+ recurse,
135
+ }
136
+ }
137
+ }
138
+
139
+ impl < ' a , ' de > Deserializer < ' a , SliceReader < ' de > > {
140
+ fn from_slice ( s : & ' de [ u8 ] , scratch : & ' a mut [ u8 ] , recurse : usize ) -> Self {
141
+ Self {
142
+ decoder : SliceReader :: new ( s) . into ( ) ,
143
+ scratch,
144
+ recurse,
145
+ }
146
+ }
147
+ }
59
148
60
149
impl < ' a , R : Read > Deserializer < ' a , R >
61
150
where
@@ -148,6 +237,8 @@ where
148
237
}
149
238
}
150
239
240
+ fn noop ( _: u8 ) { }
241
+
151
242
impl < ' de , ' a , ' b , R : Read > de:: Deserializer < ' de > for & ' a mut Deserializer < ' b , R >
152
243
where
153
244
R :: Error : core:: fmt:: Debug ,
@@ -874,11 +965,7 @@ pub fn from_reader_with_buffer<T: de::DeserializeOwned, R: Read>(
874
965
where
875
966
R :: Error : core:: fmt:: Debug ,
876
967
{
877
- let mut reader = Deserializer {
878
- decoder : reader. into ( ) ,
879
- scratch : scratch_buffer,
880
- recurse : 256 ,
881
- } ;
968
+ let mut reader = Deserializer :: from_reader ( reader, scratch_buffer, 256 ) ;
882
969
883
970
T :: deserialize ( & mut reader)
884
971
}
@@ -898,11 +985,7 @@ where
898
985
{
899
986
let mut scratch = [ 0 ; 4096 ] ;
900
987
901
- let mut reader = Deserializer {
902
- decoder : reader. into ( ) ,
903
- scratch : & mut scratch,
904
- recurse : recurse_limit,
905
- } ;
988
+ let mut reader = Deserializer :: from_reader ( reader, & mut scratch, recurse_limit) ;
906
989
907
990
T :: deserialize ( & mut reader)
908
991
}
@@ -912,15 +995,11 @@ where
912
995
pub fn deserializer_from_reader_with_buffer < R : Read > (
913
996
reader : R ,
914
997
scratch_buffer : & mut [ u8 ] ,
915
- ) -> Deserializer < ' _ , R >
998
+ ) -> Deserializer < ' _ , Reader < R > >
916
999
where
917
1000
R :: Error : core:: fmt:: Debug ,
918
1001
{
919
- Deserializer {
920
- decoder : reader. into ( ) ,
921
- scratch : scratch_buffer,
922
- recurse : 256 ,
923
- }
1002
+ Deserializer :: from_reader ( reader, scratch_buffer, 256 )
924
1003
}
925
1004
926
1005
/// Returns a deserializer with a specified scratch buffer
@@ -933,13 +1012,42 @@ pub fn deserializer_from_reader_with_buffer_and_recursion_limit<R: Read>(
933
1012
reader : R ,
934
1013
scratch_buffer : & mut [ u8 ] ,
935
1014
recurse_limit : usize ,
936
- ) -> Deserializer < ' _ , R >
1015
+ ) -> Deserializer < ' _ , Reader < R > >
937
1016
where
938
1017
R :: Error : core:: fmt:: Debug ,
939
1018
{
940
- Deserializer {
941
- decoder : reader. into ( ) ,
942
- scratch : scratch_buffer,
943
- recurse : recurse_limit,
944
- }
1019
+ Deserializer :: from_reader ( reader, scratch_buffer, recurse_limit)
1020
+ }
1021
+
1022
+ /// Deserializes as CBOR from a type with [`impl
1023
+ /// ciborium_io::Read`](ciborium_io::Read) using a 4KB buffer on the stack.
1024
+ ///
1025
+ /// If you want to deserialize faster at the cost of more memory, consider using
1026
+ /// [`from_reader_with_buffer`](from_reader_with_buffer) with a larger buffer,
1027
+ /// for example 64KB.
1028
+ #[ inline]
1029
+ pub fn from_slice < ' de , T : de:: Deserialize < ' de > > (
1030
+ reader : & ' de [ u8 ] ,
1031
+ ) -> Result < T , Error < <& ' de [ u8 ] as ciborium_io:: Read >:: Error > >
1032
+ where
1033
+ <& ' de [ u8 ] as ciborium_io:: Read >:: Error : core:: fmt:: Debug ,
1034
+ {
1035
+ let mut scratch = [ 0 ; 4096 ] ;
1036
+ from_slice_with_buffer ( reader, & mut scratch)
1037
+ }
1038
+
1039
+ /// Deserializes as CBOR from a type with [`impl
1040
+ /// ciborium_io::Read`](ciborium_io::Read), using a caller-specific buffer as a
1041
+ /// temporary scratch space.
1042
+ #[ inline]
1043
+ pub fn from_slice_with_buffer < ' de , T : de:: Deserialize < ' de > > (
1044
+ reader : & ' de [ u8 ] ,
1045
+ scratch_buffer : & mut [ u8 ] ,
1046
+ ) -> Result < T , Error < <& ' de [ u8 ] as ciborium_io:: Read >:: Error > >
1047
+ where
1048
+ <& ' de [ u8 ] as ciborium_io:: Read >:: Error : core:: fmt:: Debug ,
1049
+ {
1050
+ let mut reader = Deserializer :: from_slice ( reader, scratch_buffer, 256 ) ;
1051
+
1052
+ T :: deserialize ( & mut reader)
945
1053
}
0 commit comments