Skipping over pseudo contexts has fixed most of the tests.
This commit is contained in:
		
							parent
							
								
									f04e84dc31
								
							
						
					
					
						commit
						3c9a369908
					
				| @ -21,6 +21,16 @@ pub trait Truthiness { | ||||
| 
 | ||||
| pub trait Walkable { | ||||
|     fn walk(&self, segment: &str) -> Result<&dyn ContextElement, WalkError>; | ||||
| 
 | ||||
|     /// If an element contains meta information and should not be
 | ||||
|     /// returned as the final result of a walk, this function should
 | ||||
|     /// return true.
 | ||||
|     ///
 | ||||
|     /// For example, the iteration context contains $idx and $len but
 | ||||
|     /// it should not be the result of a dot-reference like `{.}`.
 | ||||
|     fn is_pseudo_element(&self) -> bool { | ||||
|         false | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub trait Renderable { | ||||
|  | ||||
| @ -68,6 +68,10 @@ impl Walkable for IterationContext { | ||||
|             _ => Err(WalkError::CantWalk), | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fn is_pseudo_element(&self) -> bool { | ||||
|         true | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl CompareContextElement for IterationContext { | ||||
|  | ||||
| @ -103,6 +103,10 @@ impl Walkable for ParametersContext { | ||||
|             OwnedRValue::RVLiteral(literal) => Ok(literal), | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fn is_pseudo_element(&self) -> bool { | ||||
|         true | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl Clone for ParametersContext { | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| use crate::renderer::context_element::ContextElement; | ||||
| use crate::renderer::context_element::Walkable; | ||||
| use crate::renderer::WalkError; | ||||
| use std::borrow::Borrow; | ||||
| 
 | ||||
| @ -34,6 +35,17 @@ where | ||||
|     WalkResult::FullyWalked(output) | ||||
| } | ||||
| 
 | ||||
| pub fn get_first_non_pseudo_element<'a, B>(breadcrumbs: &'a Vec<B>) -> Option<&B> | ||||
| where | ||||
|     B: Borrow<dyn ContextElement + 'a>, | ||||
| { | ||||
|     breadcrumbs | ||||
|         .iter() | ||||
|         .rev() | ||||
|         .filter(|b| !(*b).borrow().is_pseudo_element()) | ||||
|         .next() | ||||
| } | ||||
| 
 | ||||
| pub fn walk_path<'a, B, P>( | ||||
|     breadcrumbs: &'a Vec<B>, | ||||
|     path: &Vec<P>, | ||||
| @ -60,17 +72,22 @@ where | ||||
|         .borrow() | ||||
|         == "." | ||||
|     { | ||||
|         return match walk_path_from_single_level( | ||||
|             breadcrumbs | ||||
|                 .last() | ||||
|                 .expect("Breadcrumbs should never be empty"), | ||||
|             &path[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), | ||||
|         let first_non_pseudo_element = get_first_non_pseudo_element(breadcrumbs); | ||||
|         // println!(
 | ||||
|         //     "First non-pseudo element: {:?}",
 | ||||
|         //     first_non_pseudo_element.map(|b| b.borrow())
 | ||||
|         // );
 | ||||
|         return match first_non_pseudo_element { | ||||
|             None => Err(WalkError::CantWalk), | ||||
|             Some(current_context) => { | ||||
|                 match walk_path_from_single_level(current_context, &path[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() { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander