refactor(tvix/castore): drop {Directory,File,Symlink}Node

Add a `SymlinkTarget` type to represent validated symlink targets.
With this, no invalid states are representable, so we can make `Node` be
just an enum of all three kind of types, and allow access to these
fields directly.

Change-Id: I20bdd480c8d5e64a827649f303c97023b7e390f2
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12216
Reviewed-by: benjaminedwardwebb <benjaminedwardwebb@gmail.com>
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: Connor Brewster <cbrewster@hey.com>
Tested-by: BuildkiteCI
This commit is contained in:
Florian Klink 2024-08-16 02:24:12 +03:00 committed by clbot
parent 49b173786c
commit 8ea7d2b60e
27 changed files with 555 additions and 461 deletions

View file

@ -82,7 +82,7 @@ where
/// The contents in NAR serialization are writen to the passed [AsyncWrite].
pub async fn write_nar<W, BS, DS>(
mut w: W,
proto_root_node: &Node,
root_node: &Node,
blob_service: BS,
directory_service: DS,
) -> Result<(), RenderError>
@ -98,7 +98,7 @@ where
walk_node(
nar_root_node,
proto_root_node,
root_node,
b"",
blob_service,
directory_service,
@ -122,15 +122,17 @@ where
DS: DirectoryService + Send,
{
match castore_node {
Node::Symlink(symlink_node) => {
Node::Symlink { target, .. } => {
nar_node
.symlink(symlink_node.target())
.symlink(target.as_ref())
.await
.map_err(RenderError::NARWriterError)?;
}
Node::File(proto_file_node) => {
let digest = proto_file_node.digest();
Node::File {
digest,
size,
executable,
} => {
let mut blob_reader = match blob_service
.open_read(digest)
.await
@ -144,24 +146,20 @@ where
}?;
nar_node
.file(
proto_file_node.executable(),
proto_file_node.size(),
&mut blob_reader,
)
.file(*executable, *size, &mut blob_reader)
.await
.map_err(RenderError::NARWriterError)?;
}
Node::Directory(directory_node) => {
Node::Directory { digest, .. } => {
// look it up with the directory service
match directory_service
.get(directory_node.digest())
.get(digest)
.await
.map_err(|e| RenderError::StoreError(e.into()))?
{
// if it's None, that's an error!
None => Err(RenderError::DirectoryNotFound(
directory_node.digest().clone(),
digest.clone(),
bytes::Bytes::copy_from_slice(name),
))?,
Some(directory) => {