refactor(tvix/castore): add into_nodes(), implement consuming proto conv

Provide a into_nodes() function on a Directory, which consumes self and
returns owned PathComponent and Node.

Use it to provide a proper conversion from Directory to the proto
variant that doesn't clone.

There's no need for the one taking only &Directory, we don't use it
anywhere, and once someone needs that they might as well clone Directory
before converting it.

Update all other users of the `.nodes()` function to use `.into_nodes()`
where applicable, and avoid some more cloning there.

Change-Id: Id4577b9eb173c012e225337458898d3937112bcb
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12218
Tested-by: BuildkiteCI
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: Connor Brewster <cbrewster@hey.com>
This commit is contained in:
Florian Klink 2024-08-16 18:12:39 +03:00 committed by clbot
parent 5ec93b57e6
commit 21ceef4934
5 changed files with 24 additions and 29 deletions

View file

@ -142,44 +142,38 @@ impl TryFrom<&Directory> for crate::Directory {
}
}
// TODO: add a proper owned version here that moves various fields
impl From<crate::Directory> for Directory {
fn from(value: crate::Directory) -> Self {
(&value).into()
}
}
impl From<&crate::Directory> for Directory {
fn from(directory: &crate::Directory) -> Directory {
let mut directories = vec![];
let mut files = vec![];
let mut symlinks = vec![];
for (name, node) in directory.nodes() {
for (name, node) in value.into_nodes() {
match node {
crate::Node::File {
digest,
size,
executable,
} => files.push(FileNode {
name: name.to_owned().into(),
digest: digest.to_owned().into(),
size: *size,
executable: *executable,
name: name.into(),
digest: digest.into(),
size,
executable,
}),
crate::Node::Directory { digest, size } => directories.push(DirectoryNode {
name: name.to_owned().into(),
digest: digest.to_owned().into(),
size: *size,
name: name.into(),
digest: digest.into(),
size,
}),
crate::Node::Symlink { target } => {
symlinks.push(SymlinkNode {
name: name.to_owned().into(),
target: target.to_owned().into(),
name: name.into(),
target: target.into(),
});
}
}
}
Directory {
directories,
files,