git_packetline/write/
blocking_io.rs1use std::io;
2
3use crate::{MAX_DATA_LEN, U16_HEX_BYTES};
4
5pub struct Writer<T> {
8 inner: T,
10 binary: bool,
11}
12
13impl<T: io::Write> Writer<T> {
14 pub fn new(write: T) -> Self {
16 Writer {
17 inner: write,
18 binary: true,
19 }
20 }
21}
22
23impl<T> Writer<T> {
25 pub fn enable_binary_mode(&mut self) {
27 self.binary = true;
28 }
29 pub fn enable_text_mode(&mut self) {
32 self.binary = false;
33 }
34 pub fn into_inner(self) -> T {
36 self.inner
37 }
38 pub fn inner_mut(&mut self) -> &mut T {
40 &mut self.inner
41 }
42}
43
44impl<T: io::Write> io::Write for Writer<T> {
45 fn write(&mut self, mut buf: &[u8]) -> io::Result<usize> {
46 if buf.is_empty() {
47 return Err(io::Error::new(
48 io::ErrorKind::Other,
49 "empty packet lines are not permitted as '0004' is invalid",
50 ));
51 }
52
53 let mut written = 0;
54 while !buf.is_empty() {
55 let (data, rest) = buf.split_at(buf.len().min(MAX_DATA_LEN));
56 written += if self.binary {
57 crate::encode::data_to_write(data, &mut self.inner)
58 } else {
59 crate::encode::text_to_write(data, &mut self.inner)
60 }?;
61 written -= U16_HEX_BYTES + usize::from(!self.binary);
63 buf = rest;
64 }
65 Ok(written)
66 }
67
68 fn flush(&mut self) -> io::Result<()> {
69 self.inner.flush()
70 }
71}