feat(tvix/nix-compat/wire): have write_bytes accept AsRef<[u8]> payloads
This includes String, &str etc. An example testcase with &str is provided. Change-Id: I900186d6ceb52f52bd41ef4596524c1f5b52470b Reviewed-on: https://cl.tvl.fyi/c/depot/+/11376 Autosubmit: flokli <flokli@flokli.de> Tested-by: BuildkiteCI Reviewed-by: picnoir picnoir <picnoir@alternativebit.fr>
This commit is contained in:
parent
acee489866
commit
71a3855f09
2 changed files with 21 additions and 5 deletions
|
@ -89,20 +89,25 @@ where
|
||||||
|
|
||||||
/// Writes a "bytes wire packet" to a (hopefully buffered) [AsyncWriteExt].
|
/// Writes a "bytes wire packet" to a (hopefully buffered) [AsyncWriteExt].
|
||||||
///
|
///
|
||||||
|
/// Accepts anything implementing AsRef<[u8]> as payload.
|
||||||
|
///
|
||||||
/// See [read_bytes] for a description of the format.
|
/// See [read_bytes] for a description of the format.
|
||||||
///
|
///
|
||||||
/// Note: if performance matters to you, make sure your
|
/// Note: if performance matters to you, make sure your
|
||||||
/// [AsyncWriteExt] handle is buffered. This function is quite
|
/// [AsyncWriteExt] handle is buffered. This function is quite
|
||||||
/// write-intesive.
|
/// write-intesive.
|
||||||
pub async fn write_bytes<W: AsyncWriteExt + Unpin>(w: &mut W, b: &[u8]) -> std::io::Result<()> {
|
pub async fn write_bytes<W: AsyncWriteExt + Unpin, B: AsRef<[u8]>>(
|
||||||
|
w: &mut W,
|
||||||
|
b: B,
|
||||||
|
) -> std::io::Result<()> {
|
||||||
// write the size packet.
|
// write the size packet.
|
||||||
primitive::write_u64(w, b.len() as u64).await?;
|
primitive::write_u64(w, b.as_ref().len() as u64).await?;
|
||||||
|
|
||||||
// write the payload
|
// write the payload
|
||||||
w.write_all(b).await?;
|
w.write_all(b.as_ref()).await?;
|
||||||
|
|
||||||
// write padding if needed
|
// write padding if needed
|
||||||
let padding_len = padding_len(b.len() as u64) as usize;
|
let padding_len = padding_len(b.as_ref().len() as u64) as usize;
|
||||||
if padding_len != 0 {
|
if padding_len != 0 {
|
||||||
w.write_all(&EMPTY_BYTES[..padding_len]).await?;
|
w.write_all(&EMPTY_BYTES[..padding_len]).await?;
|
||||||
}
|
}
|
||||||
|
@ -209,4 +214,15 @@ mod tests {
|
||||||
.build();
|
.build();
|
||||||
assert_ok!(write_bytes(&mut mock, &input).await)
|
assert_ok!(write_bytes(&mut mock, &input).await)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_write_string() {
|
||||||
|
let input = "Hello, World!";
|
||||||
|
let len = input.len() as u64;
|
||||||
|
let mut mock = Builder::new()
|
||||||
|
.write(&len.to_le_bytes())
|
||||||
|
.write(&hex!("48656c6c6f2c20576f726c6421000000"))
|
||||||
|
.build();
|
||||||
|
assert_ok!(write_bytes(&mut mock, &input).await)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,7 +165,7 @@ where
|
||||||
// good idea.
|
// good idea.
|
||||||
debug!("write version");
|
debug!("write version");
|
||||||
// Plain str padded to 64 bits.
|
// Plain str padded to 64 bits.
|
||||||
bytes::write_bytes(&mut conn, "2.3.17".as_bytes()).await?;
|
bytes::write_bytes(&mut conn, "2.3.17").await?;
|
||||||
conn.flush().await?;
|
conn.flush().await?;
|
||||||
}
|
}
|
||||||
if protocol_minor >= 35 {
|
if protocol_minor >= 35 {
|
||||||
|
|
Loading…
Reference in a new issue