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

@ -1,6 +1,4 @@
use crate::{
B3Digest, {Directory, DirectoryNode, FileNode, Node, SymlinkNode},
};
use crate::{B3Digest, Directory, Node};
use lazy_static::lazy_static;
pub const HELLOWORLD_BLOB_CONTENTS: &[u8] = b"Hello World!";
@ -37,11 +35,11 @@ lazy_static! {
let mut dir = Directory::new();
dir.add(
".keep".into(),
Node::File(FileNode::new(
EMPTY_BLOB_DIGEST.clone(),
0,
false
))).unwrap();
Node::File{
digest: EMPTY_BLOB_DIGEST.clone(),
size: 0,
executable: false
}).unwrap();
dir
};
@ -49,22 +47,22 @@ lazy_static! {
let mut dir = Directory::new();
dir.add(
"keep".into(),
Node::Directory(DirectoryNode::new(
DIRECTORY_WITH_KEEP.digest(),
DIRECTORY_WITH_KEEP.size()
))).unwrap();
Node::Directory{
digest: DIRECTORY_WITH_KEEP.digest(),
size: DIRECTORY_WITH_KEEP.size()
}).unwrap();
dir.add(
".keep".into(),
Node::File(FileNode::new(
EMPTY_BLOB_DIGEST.clone(),
0,
false
))).unwrap();
Node::File{
digest: EMPTY_BLOB_DIGEST.clone(),
size: 0,
executable: false
}).unwrap();
dir.add(
"aa".into(),
Node::Symlink(SymlinkNode::new(
b"/nix/store/somewhereelse".to_vec().into()
).unwrap())).unwrap();
Node::Symlink{
target: "/nix/store/somewhereelse".try_into().unwrap()
}).unwrap();
dir
};
@ -73,10 +71,10 @@ lazy_static! {
let mut dir = Directory::new();
dir.add(
"a".into(),
Node::Directory(DirectoryNode::new(
DIRECTORY_A.digest(),
DIRECTORY_A.size(),
))).unwrap();
Node::Directory{
digest: DIRECTORY_A.digest(),
size: DIRECTORY_A.size(),
}).unwrap();
dir
};
@ -84,16 +82,16 @@ lazy_static! {
let mut dir = Directory::new();
dir.add(
"a".into(),
Node::Directory(DirectoryNode::new(
DIRECTORY_A.digest(),
DIRECTORY_A.size(),
))).unwrap();
Node::Directory{
digest: DIRECTORY_A.digest(),
size: DIRECTORY_A.size(),
}).unwrap();
dir.add(
"a'".into(),
Node::Directory(DirectoryNode::new(
DIRECTORY_A.digest(),
DIRECTORY_A.size(),
))).unwrap();
Node::Directory{
digest: DIRECTORY_A.digest(),
size: DIRECTORY_A.size(),
}).unwrap();
dir
};
@ -101,16 +99,16 @@ lazy_static! {
let mut dir = Directory::new();
dir.add(
"a".into(),
Node::Directory(DirectoryNode::new(
DIRECTORY_A.digest(),
DIRECTORY_A.size(),
))).unwrap();
Node::Directory{
digest: DIRECTORY_A.digest(),
size: DIRECTORY_A.size(),
}).unwrap();
dir.add(
"b".into(),
Node::Directory(DirectoryNode::new(
DIRECTORY_B.digest(),
DIRECTORY_B.size(),
))).unwrap();
Node::Directory{
digest: DIRECTORY_B.digest(),
size: DIRECTORY_B.size(),
}).unwrap();
dir
};