@@ -5,7 +5,8 @@ use thiserror::Error;
5
5
use crate :: message:: { cursor:: Cursor , ioext:: MessageWriteExt , spec, MessageError , MessageType } ;
6
6
7
7
mod prefix {
8
- // pub(super) const MESSAGE_FRAMES: u8 = b'*';
8
+ pub ( super ) const MESSAGE_START : u8 = b'*' ;
9
+ pub ( super ) const FRAME_LENGTH : u8 = b'@' ;
9
10
pub ( super ) const MESSAGE_TYPE : u8 = b'#' ;
10
11
pub ( super ) const STRING : u8 = b'+' ;
11
12
pub ( super ) const BYTES : u8 = b'$' ;
@@ -22,6 +23,8 @@ pub enum FrameError {
22
23
InvalidMessageType ( #[ from] MessageError ) ,
23
24
#[ error( "invalid frame: {0}" ) ]
24
25
Invalid ( String ) ,
26
+ #[ error( "invalid u64: {0}" ) ]
27
+ InvalidU64 ( String ) ,
25
28
// Other(common::Error),
26
29
}
27
30
@@ -30,6 +33,8 @@ pub(crate) type Time = chrono::DateTime<chrono::Utc>;
30
33
31
34
#[ derive( Debug , Clone , PartialEq ) ]
32
35
pub ( crate ) enum Frame {
36
+ MessageStart ,
37
+ Length ( u64 ) ,
33
38
MessageType ( MessageType ) ,
34
39
String ( String ) ,
35
40
Bytes ( Vec < u8 > ) ,
@@ -68,6 +73,11 @@ impl Frame {
68
73
69
74
fn read ( src : & mut Cursor ) -> Result < Frame , FrameError > {
70
75
match src. u8 ( ) ? {
76
+ prefix:: MESSAGE_START => Ok ( Frame :: MessageStart ) ,
77
+ prefix:: FRAME_LENGTH => {
78
+ let len = src. u64 ( ) ?;
79
+ Ok ( Frame :: Length ( len) )
80
+ }
71
81
prefix:: MESSAGE_TYPE => MessageType :: try_from ( src. u8 ( ) ?)
72
82
. map_err ( FrameError :: InvalidMessageType )
73
83
. map ( Frame :: MessageType ) ,
@@ -120,6 +130,11 @@ impl Frame {
120
130
W : MessageWriteExt ,
121
131
{
122
132
match self {
133
+ Frame :: MessageStart => writer. write_u8 ( prefix:: MESSAGE_START ) . await ,
134
+ Frame :: Length ( len) => {
135
+ writer. write_u8 ( prefix:: FRAME_LENGTH ) . await ?;
136
+ writer. write_u64m ( len) . await
137
+ }
123
138
Frame :: MessageType ( mt) => {
124
139
writer. write_u8 ( prefix:: MESSAGE_TYPE ) . await ?;
125
140
writer. write_u8 ( mt. into ( ) ) . await
@@ -160,15 +175,15 @@ impl IntoIterator for MessageFrames {
160
175
161
176
impl MessageFrames {
162
177
pub ( super ) fn new ( mt : MessageType , capasity : usize ) -> Self {
163
- let mut v = Vec :: with_capacity ( capasity + 1 ) ;
178
+ let mut v = Vec :: with_capacity ( capasity + 3 ) ;
179
+ let message_len = capasity + 1 ;
180
+
181
+ v. push ( Frame :: MessageStart ) ;
182
+ v. push ( Frame :: Length ( message_len as u64 ) ) ;
164
183
v. push ( Frame :: MessageType ( mt) ) ;
165
184
MessageFrames ( v)
166
185
}
167
186
168
- pub ( super ) fn len ( & self ) -> usize {
169
- self . 0 . len ( )
170
- }
171
-
172
187
pub ( crate ) fn check_parse ( src : & mut Cursor ) -> Result < ( ) , FrameError > {
173
188
let frames_len = MessageFrames :: frames_len ( src) ?;
174
189
@@ -199,9 +214,12 @@ impl MessageFrames {
199
214
}
200
215
201
216
fn frames_len ( src : & mut Cursor ) -> Result < u64 , FrameError > {
202
- if src. u8 ( ) ? != spec :: MESSAGE_START {
217
+ if src. u8 ( ) ? != prefix :: MESSAGE_START {
203
218
return Err ( FrameError :: Invalid ( "message frames prefix expected" . into ( ) ) ) ;
204
219
}
220
+ if src. u8 ( ) ? != prefix:: FRAME_LENGTH {
221
+ return Err ( FrameError :: Invalid ( "message frame length expected" . into ( ) ) ) ;
222
+ }
205
223
src. u64 ( )
206
224
}
207
225
0 commit comments