@@ -7,13 +7,19 @@ use super::SEGMENTS_COUNT_LIMIT;
7
7
8
8
const U32_LEN_IN_BYTES : usize = core:: mem:: size_of :: < u32 > ( ) ;
9
9
10
- pub ( crate ) struct ReadSegmentTableResult {
10
+ /// Information about a message read from its segment table.
11
+ pub struct NoAllocSegmentTableInfo {
12
+ /// The number of segments in the message.
11
13
pub segments_count : usize ,
14
+
15
+ /// The number of bytes in the segment table.
12
16
pub segment_table_length_bytes : usize ,
17
+
18
+ /// The total number of bytes in all segments of the message.
13
19
pub total_segments_length_bytes : usize ,
14
20
}
15
21
16
- fn read_segment_table ( slice : & [ u8 ] , options : ReaderOptions ) -> Result < ReadSegmentTableResult > {
22
+ fn read_segment_table ( slice : & [ u8 ] , options : ReaderOptions ) -> Result < NoAllocSegmentTableInfo > {
17
23
let mut remaining = slice;
18
24
19
25
verify_alignment ( remaining. as_ptr ( ) ) ?;
@@ -74,7 +80,7 @@ fn read_segment_table(slice: &[u8], options: ReaderOptions) -> Result<ReadSegmen
74
80
) ) ) ;
75
81
}
76
82
77
- Ok ( ReadSegmentTableResult {
83
+ Ok ( NoAllocSegmentTableInfo {
78
84
segments_count,
79
85
segment_table_length_bytes : expected_data_offset,
80
86
total_segments_length_bytes,
@@ -111,7 +117,11 @@ pub struct NoAllocBufferSegments<T> {
111
117
}
112
118
113
119
impl < T > NoAllocBufferSegments < T > {
114
- pub ( crate ) fn from_segment_table ( buffer : T , info : ReadSegmentTableResult ) -> Self {
120
+ /// Constructs a NoAllocBufferSegments from a buffer and a [`NoAllocSegmentTableInfo`].
121
+ /// This method is used internally by [`NoAllocBufferSegments::from_slice()`]
122
+ /// and [`NoAllocBufferSegments::from_buffer()`]. It has been made public to allow for
123
+ /// situations where the segment table is read by nonstandard means.
124
+ pub fn from_segment_table_info ( buffer : T , info : NoAllocSegmentTableInfo ) -> Self {
115
125
if info. segments_count == 1 {
116
126
Self {
117
127
buffer,
@@ -144,7 +154,7 @@ impl<'b> NoAllocBufferSegments<&'b [u8]> {
144
154
let message = & slice[ ..message_length] ;
145
155
* slice = & slice[ message_length..] ;
146
156
147
- Ok ( Self :: from_segment_table ( message, segment_table_info) )
157
+ Ok ( Self :: from_segment_table_info ( message, segment_table_info) )
148
158
}
149
159
}
150
160
@@ -156,7 +166,7 @@ impl<T: AsRef<[u8]>> NoAllocBufferSegments<T> {
156
166
/// Otherwise, `buffer` must be 8-byte aligned (attempts to read the message will trigger errors).
157
167
pub fn from_buffer ( buffer : T , options : ReaderOptions ) -> Result < Self > {
158
168
let segment_table_info = read_segment_table ( buffer. as_ref ( ) , options) ?;
159
- Ok ( Self :: from_segment_table ( buffer, segment_table_info) )
169
+ Ok ( Self :: from_segment_table_info ( buffer, segment_table_info) )
160
170
}
161
171
}
162
172
0 commit comments