diff --git a/tvix/build/src/proto/mod.rs b/tvix/build/src/proto/mod.rs
index e359b5b5b..528817b97 100644
--- a/tvix/build/src/proto/mod.rs
+++ b/tvix/build/src/proto/mod.rs
@@ -1,7 +1,9 @@
use std::path::{Path, PathBuf};
use itertools::Itertools;
-use tvix_castore::proto::{NamedNode, ValidateNodeError};
+use tvix_castore::directoryservice::NamedNode;
+use tvix_castore::directoryservice::Node;
+use tvix_castore::ValidateNodeError;
mod grpc_buildservice_wrapper;
@@ -123,18 +125,17 @@ impl BuildRequest {
/// and all restrictions around paths themselves (relative, clean, …) need
// to be fulfilled.
pub fn validate(&self) -> Result<(), ValidateBuildRequestError> {
- // validate all input nodes
- for (i, n) in self.inputs.iter().enumerate() {
- // ensure the input node itself is valid
- n.validate()
- .map_err(|e| ValidateBuildRequestError::InvalidInputNode(i, e))?;
- }
-
// now we can look at the names, and make sure they're sorted.
if !is_sorted(
self.inputs
.iter()
- .map(|e| e.node.as_ref().unwrap().get_name()),
+ // TODO(flokli) handle conversion errors and store result somewhere
+ .map(|e| {
+ Node::try_from(e.node.as_ref().unwrap())
+ .unwrap()
+ .get_name()
+ .clone()
+ }),
) {
Err(ValidateBuildRequestError::InputNodesNotSorted)?
}
diff --git a/tvix/castore/src/digests.rs b/tvix/castore/src/digests.rs
index ef9a7326b..4d919ff0d 100644
--- a/tvix/castore/src/digests.rs
+++ b/tvix/castore/src/digests.rs
@@ -6,7 +6,7 @@ use thiserror::Error;
pub struct B3Digest(Bytes);
// TODO: allow converting these errors to crate::Error
-#[derive(Error, Debug)]
+#[derive(Error, Debug, PartialEq)]
pub enum Error {
#[error("invalid digest length: {0}")]
InvalidDigestLen(usize),
diff --git a/tvix/castore/src/directoryservice/bigtable.rs b/tvix/castore/src/directoryservice/bigtable.rs
index d10dddaf9..73ab4342d 100644
--- a/tvix/castore/src/directoryservice/bigtable.rs
+++ b/tvix/castore/src/directoryservice/bigtable.rs
@@ -9,7 +9,9 @@ use std::sync::Arc;
use tonic::async_trait;
use tracing::{instrument, trace, warn};
-use super::{utils::traverse_directory, DirectoryPutter, DirectoryService, SimplePutter};
+use super::{
+ utils::traverse_directory, Directory, DirectoryPutter, DirectoryService, SimplePutter,
+};
use crate::composition::{CompositionContext, ServiceBuilder};
use crate::{proto, B3Digest, Error};
@@ -149,7 +151,7 @@ fn derive_directory_key(digest: &B3Digest) -> String {
#[async_trait]
impl DirectoryService for BigtableDirectoryService {
#[instrument(skip(self, digest), err, fields(directory.digest = %digest))]
- async fn get(&self, digest: &B3Digest) -> Result