1
- use crate :: { Channel , DELIMITER_LINE , ERR_PREFIX , FLUSH_LINE , MAX_DATA_LEN , RESPONSE_END_LINE } ;
1
+ use crate :: MAX_DATA_LEN ;
2
2
use quick_error:: quick_error;
3
- use std:: io;
4
3
5
4
quick_error ! {
6
5
/// The error returned by most functions in the [`encode`][crate::encode] module
7
6
#[ derive( Debug ) ]
8
7
#[ allow( missing_docs) ]
9
8
pub enum Error {
10
- Io ( err: io:: Error ) {
9
+ Io ( err: std :: io:: Error ) {
11
10
display( "An error occurred while writing" )
12
11
from( )
13
12
source( err)
@@ -21,72 +20,81 @@ quick_error! {
21
20
}
22
21
}
23
22
24
- /// Write a response-end message to `out`.
25
- pub fn response_end_to_write ( mut out : impl io:: Write ) -> io:: Result < usize > {
26
- out. write_all ( RESPONSE_END_LINE ) . map ( |_| 4 )
27
- }
28
-
29
- /// Write a delim message to `out`.
30
- pub fn delim_to_write ( mut out : impl io:: Write ) -> io:: Result < usize > {
31
- out. write_all ( DELIMITER_LINE ) . map ( |_| 4 )
32
- }
23
+ #[ cfg( feature = "blocking-io" ) ]
24
+ mod blocking_io {
25
+ use super :: u16_to_hex;
26
+ use crate :: { encode:: Error , Channel , DELIMITER_LINE , ERR_PREFIX , FLUSH_LINE , MAX_DATA_LEN , RESPONSE_END_LINE } ;
27
+ use std:: io;
33
28
34
- /// Write a flush message to `out`.
35
- pub fn flush_to_write ( mut out : impl io:: Write ) -> io:: Result < usize > {
36
- out. write_all ( FLUSH_LINE ) . map ( |_| 4 )
37
- }
29
+ /// Write a response-end message to `out`.
30
+ pub fn response_end_to_write ( mut out : impl io:: Write ) -> io:: Result < usize > {
31
+ out. write_all ( RESPONSE_END_LINE ) . map ( |_| 4 )
32
+ }
38
33
39
- /// Write an error ` message` to `out`.
40
- pub fn error_to_write ( message : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
41
- prefixed_data_to_write ( ERR_PREFIX , message , out)
42
- }
34
+ /// Write a delim message to `out`.
35
+ pub fn delim_to_write ( mut out : impl io:: Write ) -> io :: Result < usize > {
36
+ out. write_all ( DELIMITER_LINE ) . map ( |_| 4 )
37
+ }
43
38
44
- /// Write `data` of `kind` to `out` using side-band encoding .
45
- pub fn band_to_write ( kind : Channel , data : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
46
- prefixed_data_to_write ( & [ kind as u8 ] , data , out)
47
- }
39
+ /// Write a flush message to `out`.
40
+ pub fn flush_to_write ( mut out : impl io:: Write ) -> io :: Result < usize > {
41
+ out. write_all ( FLUSH_LINE ) . map ( |_| 4 )
42
+ }
48
43
49
- /// Write a `data` message to `out`.
50
- pub fn data_to_write ( data : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
51
- prefixed_data_to_write ( & [ ] , data , out)
52
- }
44
+ /// Write an error ` message` to `out`.
45
+ pub fn error_to_write ( message : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
46
+ prefixed_data_to_write ( ERR_PREFIX , message , out)
47
+ }
53
48
54
- /// Write a `text` message to `out`, which is assured to end in a newline .
55
- pub fn text_to_write ( text : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
56
- prefixed_and_suffixed_data_to_write ( & [ ] , text , & [ b'\n' ] , out)
57
- }
49
+ /// Write `data` of `kind` to `out` using side-band encoding .
50
+ pub fn band_to_write ( kind : Channel , data : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
51
+ prefixed_data_to_write ( & [ kind as u8 ] , data , out)
52
+ }
58
53
59
- fn prefixed_data_to_write ( prefix : & [ u8 ] , data : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
60
- prefixed_and_suffixed_data_to_write ( prefix, data, & [ ] , out)
61
- }
54
+ /// Write a `data` message to `out`.
55
+ pub fn data_to_write ( data : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
56
+ prefixed_data_to_write ( & [ ] , data, out)
57
+ }
62
58
63
- fn prefixed_and_suffixed_data_to_write (
64
- prefix : & [ u8 ] ,
65
- data : & [ u8 ] ,
66
- suffix : & [ u8 ] ,
67
- mut out : impl io:: Write ,
68
- ) -> Result < usize , Error > {
69
- let data_len = prefix. len ( ) + data. len ( ) + suffix. len ( ) ;
70
- if data_len > MAX_DATA_LEN {
71
- return Err ( Error :: DataLengthLimitExceeded ( data_len) ) ;
59
+ /// Write a `text` message to `out`, which is assured to end in a newline.
60
+ pub fn text_to_write ( text : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
61
+ prefixed_and_suffixed_data_to_write ( & [ ] , text, & [ b'\n' ] , out)
72
62
}
73
- if data. is_empty ( ) {
74
- return Err ( Error :: DataIsEmpty ) ;
63
+
64
+ fn prefixed_data_to_write ( prefix : & [ u8 ] , data : & [ u8 ] , out : impl io:: Write ) -> Result < usize , Error > {
65
+ prefixed_and_suffixed_data_to_write ( prefix, data, & [ ] , out)
75
66
}
76
67
77
- let data_len = data_len + 4 ;
78
- let buf = u16_to_hex ( data_len as u16 ) ;
68
+ fn prefixed_and_suffixed_data_to_write (
69
+ prefix : & [ u8 ] ,
70
+ data : & [ u8 ] ,
71
+ suffix : & [ u8 ] ,
72
+ mut out : impl io:: Write ,
73
+ ) -> Result < usize , Error > {
74
+ let data_len = prefix. len ( ) + data. len ( ) + suffix. len ( ) ;
75
+ if data_len > MAX_DATA_LEN {
76
+ return Err ( Error :: DataLengthLimitExceeded ( data_len) ) ;
77
+ }
78
+ if data. is_empty ( ) {
79
+ return Err ( Error :: DataIsEmpty ) ;
80
+ }
79
81
80
- out. write_all ( & buf) ?;
81
- if !prefix. is_empty ( ) {
82
- out. write_all ( prefix) ?;
83
- }
84
- out. write_all ( data) ?;
85
- if !suffix. is_empty ( ) {
86
- out. write_all ( suffix) ?;
82
+ let data_len = data_len + 4 ;
83
+ let buf = u16_to_hex ( data_len as u16 ) ;
84
+
85
+ out. write_all ( & buf) ?;
86
+ if !prefix. is_empty ( ) {
87
+ out. write_all ( prefix) ?;
88
+ }
89
+ out. write_all ( data) ?;
90
+ if !suffix. is_empty ( ) {
91
+ out. write_all ( suffix) ?;
92
+ }
93
+ Ok ( data_len)
87
94
}
88
- Ok ( data_len)
89
95
}
96
+ #[ cfg( feature = "blocking-io" ) ]
97
+ pub use blocking_io:: * ;
90
98
91
99
pub ( crate ) fn u16_to_hex ( value : u16 ) -> [ u8 ; 4 ] {
92
100
let mut buf = [ 0u8 ; 4 ] ;
0 commit comments