From a58b605e59c629b31ecdc5e31bf63ef9a5b80925 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 24 May 2020 14:17:53 -0400 Subject: [PATCH] Add support for dot paths to owned_walk_path. --- src/renderer/walking.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/renderer/walking.rs b/src/renderer/walking.rs index b699254..4bc289b 100644 --- a/src/renderer/walking.rs +++ b/src/renderer/walking.rs @@ -74,7 +74,30 @@ pub fn owned_walk_path<'a>( breadcrumbs: &'a Vec>, path: &Vec, ) -> Result<&'a dyn ContextElement, WalkError> { + if path.is_empty() { + return Ok(breadcrumbs + .last() + .expect("Breadcrumbs should never be empty") + .as_ref()); + } + let path_reference: Vec<&str> = path.iter().map(|p| &p[..]).collect(); + if path.first().expect("Already proved path is not empty") == "." { + return match walk_path_from_single_level( + breadcrumbs + .last() + .expect("Breadcrumbs should never be empty") + .as_ref(), + &path_reference[1..], + ) { + // If no walking was done at all or we partially walked + // then stop trying to find anything because '.' restricts + // us to the current scope + WalkResult::NoWalk | WalkResult::PartialWalk => Err(WalkError::CantWalk), + WalkResult::FullyWalked(new_context) => Ok(new_context), + }; + } + for context in breadcrumbs.iter().rev() { match walk_path_from_single_level(context.as_ref(), &path_reference) { // If no walking was done at all, keep looping