Switch the get_loop_elements implementation to only return populated arrays when its an array-like object.
This commit is contained in:
		
							parent
							
								
									59ee4f508f
								
							
						
					
					
						commit
						966499db76
					
				
							
								
								
									
										26
									
								
								src/bin.rs
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								src/bin.rs
									
									
									
									
									
								
							| @ -294,30 +294,8 @@ impl Walkable for serde_json::Value { | ||||
| impl Loopable for serde_json::Value { | ||||
|     fn get_loop_elements(&self) -> Vec<&dyn ContextElement> { | ||||
|         match self { | ||||
|             serde_json::Value::Null => Vec::new(), | ||||
|             serde_json::Value::Bool(boolean) => { | ||||
|                 if *boolean { | ||||
|                     vec![self] | ||||
|                 } else { | ||||
|                     Vec::new() | ||||
|                 } | ||||
|             } | ||||
|             serde_json::Value::Number(_num) => vec![self], | ||||
|             serde_json::Value::String(string_value) => { | ||||
|                 if string_value.is_empty() { | ||||
|                     Vec::new() | ||||
|                 } else { | ||||
|                     vec![self] | ||||
|                 } | ||||
|             } | ||||
|             serde_json::Value::Array(array_value) => { | ||||
|                 if array_value.is_empty() { | ||||
|                     Vec::new() | ||||
|                 } else { | ||||
|                     array_value.iter().map(|x| x as _).collect() | ||||
|                 } | ||||
|             } | ||||
|             serde_json::Value::Object(_obj) => vec![self], | ||||
|             serde_json::Value::Array(array_value) => array_value.iter().map(|x| x as _).collect(), | ||||
|             _ => Vec::new(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -30,13 +30,12 @@ pub trait Renderable { | ||||
| pub trait Loopable { | ||||
|     /// Return the elements for a Dust section
 | ||||
|     ///
 | ||||
|     /// Sections in dust are accomplished with the {#path} syntax. A
 | ||||
|     /// section has a truthiness check performed on it. If that
 | ||||
|     /// truthiness check fails, then it will render the
 | ||||
|     /// else-block. Otherwise if its a scalar value it will render
 | ||||
|     /// once with the context being the element at that path. Finally,
 | ||||
|     /// if its an array-like value then it will render n-times, once
 | ||||
|     /// for each element of the array.
 | ||||
|     /// Sections in dust are accomplished with the {#path} syntax.  If
 | ||||
|     /// its an array-like value then it will render n-times, once for
 | ||||
|     /// each element of the array. If this is a scalar value, then
 | ||||
|     /// return an empty array. Sections with scalar values will still
 | ||||
|     /// be rendered (only once) if their truthiness check comes back
 | ||||
|     /// true.
 | ||||
|     fn get_loop_elements(&self) -> Vec<&dyn ContextElement>; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -54,7 +54,7 @@ impl Loopable for IterationContext { | ||||
|         // TODO: Would this even ever be called? Won't matter, but I'd
 | ||||
|         // like to know. Since it is injected 1 above the current
 | ||||
|         // context, we wouldn't be able to access it with `{.}`.
 | ||||
|         vec![self] | ||||
|         Vec::new() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -91,7 +91,7 @@ impl Loopable for ParametersContext { | ||||
|         // TODO: Would this even ever be called? Won't matter, but I'd
 | ||||
|         // like to know. Since it is injected 1 above the current
 | ||||
|         // context, we wouldn't be able to access it with `{.}`.
 | ||||
|         vec![self] | ||||
|         Vec::new() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -158,16 +158,7 @@ impl Renderable for OwnedLiteral { | ||||
| 
 | ||||
| impl Loopable for OwnedLiteral { | ||||
|     fn get_loop_elements(&self) -> Vec<&dyn ContextElement> { | ||||
|         match self { | ||||
|             OwnedLiteral::LString(text) => { | ||||
|                 if text.is_empty() { | ||||
|                     Vec::new() | ||||
|                 } else { | ||||
|                     vec![self] | ||||
|                 } | ||||
|             } | ||||
|             OwnedLiteral::LPositiveInteger(num) => vec![self], | ||||
|         } | ||||
|         Vec::new() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -545,11 +545,7 @@ mod tests { | ||||
| 
 | ||||
|     impl Loopable for String { | ||||
|         fn get_loop_elements(&self) -> Vec<&dyn ContextElement> { | ||||
|             if self.is_empty() { | ||||
|                 Vec::new() | ||||
|             } else { | ||||
|                 vec![self] | ||||
|             } | ||||
|             Vec::new() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -590,7 +586,7 @@ mod tests { | ||||
| 
 | ||||
|     impl Loopable for u64 { | ||||
|         fn get_loop_elements(&self) -> Vec<&dyn ContextElement> { | ||||
|             vec![self] | ||||
|             Vec::new() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -640,7 +636,7 @@ mod tests { | ||||
| 
 | ||||
|     impl<I: 'static + ContextElement + Clone> Loopable for HashMap<String, I> { | ||||
|         fn get_loop_elements(&self) -> Vec<&dyn ContextElement> { | ||||
|             vec![self] | ||||
|             Vec::new() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander