Skip to content

Commit 2c44350

Browse files
committed
[git-packetline] it compiles, but write_all needs to be implemented by hand
1 parent 13127ee commit 2c44350

File tree

1 file changed

+34
-11
lines changed

1 file changed

+34
-11
lines changed

git-packetline/src/encode.rs

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,35 @@ mod async_io {
4949
WriteData,
5050
WriteSuffix,
5151
}
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+
}
5270

5371
impl<W: AsyncWrite + Unpin + ?Sized> AsyncWrite for LineWriter<'_, W> {
5472
fn poll_write(mut self: Pin<&mut Self>, cx: &mut Context<'_>, data: &[u8]) -> Poll<io::Result<usize>> {
5573
fn into_io_err(err: Error) -> io::Error {
5674
io::Error::new(io::ErrorKind::Other, err)
5775
}
5876
loop {
59-
match &mut self.state {
77+
let mut this = self.as_mut().project();
78+
match &mut this.state {
6079
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();
6281
if data_len > MAX_DATA_LEN {
6382
return Poll::Ready(Err(into_io_err(Error::DataLengthLimitExceeded(data_len))));
6483
}
@@ -67,17 +86,21 @@ mod async_io {
6786
}
6887
let data_len = data_len + 4;
6988
let len_buf = u16_to_hex(data_len as u16);
70-
self.state = State::WriteHexLen(len_buf)
89+
*this.state = State::WriteHexLen(len_buf)
7190
}
7291
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));
7694
}
77-
if !self.prefix.is_empty() {
78-
self.state = State::WritePrefix
95+
if !this.prefix.is_empty() {
96+
*this.state = State::WritePrefix
7997
} 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));
81104
}
82105
}
83106
_ => todo!("other states"),
@@ -86,12 +109,12 @@ mod async_io {
86109
}
87110

88111
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
89-
let mut this = self.project();
112+
let this = self.project();
90113
this.writer.poll_flush(cx)
91114
}
92115

93116
fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
94-
let mut this = self.project();
117+
let this = self.project();
95118
this.writer.poll_close(cx)
96119
}
97120
}

0 commit comments

Comments
 (0)