feat(tvix/nix-compat): read client setting from wire
Add the primitives necessary to read the client settings from the Nix daemon wire protocol. Introducing the read_string primitive. This trivial primitive parses a read_bytes call, check the bytes are valid utf-8 bytes and wraps the result in a String. Change-Id: Ie1253523a6bd4e31e7924e9898a0898109da2fa0 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11358 Reviewed-by: flokli <flokli@flokli.de> Tested-by: BuildkiteCI
This commit is contained in:
parent
289b3126db
commit
199f9b0a79
2 changed files with 225 additions and 3 deletions
|
|
@ -1,4 +1,7 @@
|
|||
use std::ops::RangeBounds;
|
||||
use std::{
|
||||
io::{Error, ErrorKind},
|
||||
ops::RangeBounds,
|
||||
};
|
||||
|
||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||
|
||||
|
|
@ -58,6 +61,21 @@ where
|
|||
Ok(buf)
|
||||
}
|
||||
|
||||
/// Read a Nix daemon string from the AsyncWrite, encoded as utf8.
|
||||
/// Rejects reading more than `allowed_size` bytes
|
||||
///
|
||||
/// A Nix daemon string is made up of two distincts parts:
|
||||
/// 1. Its lenght, LE-encoded on 64 bits.
|
||||
/// 2. Its content. 0-padded on 64 bits.
|
||||
pub async fn read_string<R, S>(r: &mut R, allowed_size: S) -> std::io::Result<String>
|
||||
where
|
||||
R: AsyncReadExt + Unpin,
|
||||
S: RangeBounds<u64>,
|
||||
{
|
||||
let bytes = read_bytes(r, allowed_size).await?;
|
||||
String::from_utf8(bytes).map_err(|e| Error::new(ErrorKind::InvalidData, e))
|
||||
}
|
||||
|
||||
/// Writes a sequence of sized bits to a (hopefully buffered)
|
||||
/// [AsyncWriteExt] handle.
|
||||
///
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue