feat(tvix/eval): context-aware coerce_to_string
				
					
				
			I am still undecided whether we need a CoercionKind to control the coerced context, here's a simple attempt. Change-Id: Ibe59d09ef26c519a6acfdfe392014446646dd6d8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10426 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI Autosubmit: raitobezarius <tvl@lahfa.xyz>
This commit is contained in:
		
							parent
							
								
									802f374a90
								
							
						
					
					
						commit
						743c362049
					
				
					 2 changed files with 18 additions and 2 deletions
				
			
		|  | @ -318,15 +318,27 @@ impl Value { | ||||||
|         // Track if we are coercing the first value of a list to correctly emit
 |         // Track if we are coercing the first value of a list to correctly emit
 | ||||||
|         // separating white spaces.
 |         // separating white spaces.
 | ||||||
|         let mut is_list_head = None; |         let mut is_list_head = None; | ||||||
|  |         // FIXME(raitobezarius): as per https://b.tvl.fyi/issues/364
 | ||||||
|  |         // we might be interested into more powerful context-related coercion kinds.
 | ||||||
|  |         let mut context: NixContext = NixContext::new(); | ||||||
|  | 
 | ||||||
|         loop { |         loop { | ||||||
|             let value = if let Some(v) = vals.pop() { |             let value = if let Some(v) = vals.pop() { | ||||||
|                 v.force(co, span.clone()).await? |                 v.force(co, span.clone()).await? | ||||||
|             } else { |             } else { | ||||||
|                 return Ok(Value::String(result.into())); |                 return Ok(Value::String(NixString::new_context_from( | ||||||
|  |                     context, | ||||||
|  |                     result.as_str(), | ||||||
|  |                 ))); | ||||||
|             }; |             }; | ||||||
|             let coerced = match (value, kind) { |             let coerced = match (value, kind) { | ||||||
|                 // coercions that are always done
 |                 // coercions that are always done
 | ||||||
|                 (Value::String(s), _) => Ok(s.as_str().to_owned()), |                 (Value::String(mut s), _) => { | ||||||
|  |                     if let Some(ctx) = s.context_mut() { | ||||||
|  |                         context = context.join(ctx); | ||||||
|  |                     } | ||||||
|  |                     Ok(s.as_str().to_owned()) | ||||||
|  |                 } | ||||||
| 
 | 
 | ||||||
|                 // TODO(sterni): Think about proper encoding handling here. This needs
 |                 // TODO(sterni): Think about proper encoding handling here. This needs
 | ||||||
|                 // general consideration anyways, since one current discrepancy between
 |                 // general consideration anyways, since one current discrepancy between
 | ||||||
|  |  | ||||||
|  | @ -322,6 +322,10 @@ impl NixString { | ||||||
|         Self::new_context_from(context, &s.into_boxed_str()) |         Self::new_context_from(context, &s.into_boxed_str()) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     pub(crate) fn context_mut(&mut self) -> Option<&mut NixContext> { | ||||||
|  |         return self.1.as_mut(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     pub fn iter_plain(&self) -> impl Iterator<Item = &str> { |     pub fn iter_plain(&self) -> impl Iterator<Item = &str> { | ||||||
|         return self.1.iter().flat_map(|context| context.iter_plain()); |         return self.1.iter().flat_map(|context| context.iter_plain()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue