@@ -49,16 +49,35 @@ mod async_io {
49
49
WriteData ,
50
50
WriteSuffix ,
51
51
}
52
+ impl Default for State {
53
+ fn default ( ) -> Self {
54
+ State :: Idle
55
+ }
56
+ }
57
+ impl < ' a , W : AsyncWrite + Unpin + ?Sized > LineWriter < ' a , W > {
58
+ /// Create a new line writer writing data with a `prefix` and `suffix`.
59
+ ///
60
+ /// Keep the additional `prefix` or `suffix` buffers empty if no prefix or suffix should be written.
61
+ pub fn new ( writer : & ' a mut W , prefix : & ' a [ u8 ] , suffix : & ' a [ u8 ] ) -> Self {
62
+ LineWriter {
63
+ writer,
64
+ prefix,
65
+ suffix,
66
+ state : State :: default ( ) ,
67
+ }
68
+ }
69
+ }
52
70
53
71
impl < W : AsyncWrite + Unpin + ?Sized > AsyncWrite for LineWriter < ' _ , W > {
54
72
fn poll_write ( mut self : Pin < & mut Self > , cx : & mut Context < ' _ > , data : & [ u8 ] ) -> Poll < io:: Result < usize > > {
55
73
fn into_io_err ( err : Error ) -> io:: Error {
56
74
io:: Error :: new ( io:: ErrorKind :: Other , err)
57
75
}
58
76
loop {
59
- match & mut self . state {
77
+ let mut this = self . as_mut ( ) . project ( ) ;
78
+ match & mut this. state {
60
79
State :: Idle => {
61
- let data_len = self . prefix . len ( ) + data. len ( ) + self . suffix . len ( ) ;
80
+ let data_len = this . prefix . len ( ) + data. len ( ) + this . suffix . len ( ) ;
62
81
if data_len > MAX_DATA_LEN {
63
82
return Poll :: Ready ( Err ( into_io_err ( Error :: DataLengthLimitExceeded ( data_len) ) ) ) ;
64
83
}
@@ -67,17 +86,21 @@ mod async_io {
67
86
}
68
87
let data_len = data_len + 4 ;
69
88
let len_buf = u16_to_hex ( data_len as u16 ) ;
70
- self . state = State :: WriteHexLen ( len_buf)
89
+ * this . state = State :: WriteHexLen ( len_buf)
71
90
}
72
91
State :: WriteHexLen ( hex_len) => {
73
- {
74
- let mut this = self . as_mut ( ) . project ( ) ;
75
- futures_lite:: ready!( this. writer. poll_write( cx, hex_len. as_ref( ) ) ) ;
92
+ if let Err ( err) = futures_lite:: ready!( this. writer. poll_write( cx, hex_len. as_ref( ) ) ) {
93
+ return Poll :: Ready ( Err ( err) ) ;
76
94
}
77
- if !self . prefix . is_empty ( ) {
78
- self . state = State :: WritePrefix
95
+ if !this . prefix . is_empty ( ) {
96
+ * this . state = State :: WritePrefix
79
97
} else {
80
- self . state = State :: WriteData
98
+ * this. state = State :: WriteData
99
+ }
100
+ }
101
+ State :: WritePrefix => {
102
+ if let Err ( err) = futures_lite:: ready!( this. writer. poll_write( cx, this. prefix) ) {
103
+ return Poll :: Ready ( Err ( err) ) ;
81
104
}
82
105
}
83
106
_ => todo ! ( "other states" ) ,
@@ -86,12 +109,12 @@ mod async_io {
86
109
}
87
110
88
111
fn poll_flush ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < io:: Result < ( ) > > {
89
- let mut this = self . project ( ) ;
112
+ let this = self . project ( ) ;
90
113
this. writer . poll_flush ( cx)
91
114
}
92
115
93
116
fn poll_close ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < io:: Result < ( ) > > {
94
- let mut this = self . project ( ) ;
117
+ let this = self . project ( ) ;
95
118
this. writer . poll_close ( cx)
96
119
}
97
120
}
0 commit comments