diff --git a/src/filesystem/drive/mod.rs b/src/filesystem/drive/mod.rs index 844672f..961eba6 100644 --- a/src/filesystem/drive/mod.rs +++ b/src/filesystem/drive/mod.rs @@ -285,31 +285,30 @@ impl Drive { pub async fn full_path_from_root( &self, target: &PermanentId, - ) -> Result, OperationError> { + ) -> Result, OperationError> { let inner_read = &self.inner.read().await; - let root = inner_read.root_node().map_err(|_| OperationError::Other("no root node"))?; - let mut next = target.clone(); - if next == root.permanent_id() { - return Ok(vec![]); - } - let target_node = inner_read.by_perm_id(target).map_err(|_| OperationError::MissingPermanentId(*target))?; - let mut path = vec![target_node.name().into_inner()]; - loop { - let current_node = inner_read.by_perm_id(&next)?; - let parent_id = current_node.parent_id().ok_or(OperationError::InternalCorruption(current_node.id(), "no parent"))?; + let target_node = inner_read + .by_perm_id(target) + .map_err(|_| OperationError::MissingPermanentId(*target))?; + + let target_node_name = match target_node.name() { + NodeName::Root => return Ok(Vec::new()), + NoneName::Named(name) => name.to_string(), + }; + + let mut path = vec![target_node_name()]; + while let Some(parent_id) = target_node.parent_id() { let parent_node = inner_read.by_perm_id(&parent_id)?; - let parent_name = parent_node.name(); - match parent_name { - NodeName::Root => { - path.reverse(); - return Ok(path); - }, - NodeName::Named(name) => path.push(name.clone()), - } - next = parent_id; + + let parent_name = match parent_node.name() { + NodeName::Root => break, + NodeName::Named(name) => path.push(name.to_string()), + }; } - } + path.reverse(); + Ok(path) + } } #[derive(Debug, thiserror::Error)] diff --git a/src/filesystem/nodes/node_name.rs b/src/filesystem/nodes/node_name.rs index 17d608e..43378fa 100644 --- a/src/filesystem/nodes/node_name.rs +++ b/src/filesystem/nodes/node_name.rs @@ -117,13 +117,6 @@ impl NodeName { Self::Named(name) => 2 + name.len(), } } - - pub(crate) fn into_inner(self) -> String { - match self { - Self::Root => String::from(""), - Self::Named(name) => name, - } - } } impl std::convert::TryFrom<&str> for NodeName {