diff options
author | Ryan Lahfa <tvl@lahfa.xyz> | 2023-12-27T17·13+0100 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2024-01-03T18·08+0000 |
commit | 7dcb37fc52090636d542f9d8d0d45a00a5c24c55 (patch) | |
tree | e49fa138ea77941c8ba301cf7adc094fd2581573 /tvix | |
parent | 375f7eaa59d5043be91ae0bbd47f3305628790d5 (diff) |
feat(tvix/eval): context-aware `substring` r/7324
`substring` has a very funny behavior when it comes to empty strings, it propagates the context too, this is used in nixpkgs to attach context to strings without using any builtin: `lib.addContextFrom`. Change-Id: Id655356799b3485f7519b3d1914c630f9d8416c3 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10448 Autosubmit: raitobezarius <tvl@lahfa.xyz> Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix')
-rw-r--r-- | tvix/eval/src/builtins/mod.rs | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index ee551bbaf5f6..eaa1d1f98d5d 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -1081,7 +1081,7 @@ mod pure_builtins { if x.is_catchable() { return Ok(x); } - let x = x.to_str()?; + let x = x.to_contextful_str()?; if beg < 0 { return Err(ErrorKind::IndexOutOfBounds { index: beg }); @@ -1092,7 +1092,7 @@ mod pure_builtins { // non-negative when the starting index is GTE the // string's length. if beg >= x.as_str().len() { - return Ok(Value::String("".into())); + return Ok(Value::String(NixString::new_inherit_context_from(&x, ""))); } let end = if len < 0 { @@ -1101,7 +1101,10 @@ mod pure_builtins { cmp::min(beg + (len as usize), x.as_str().len()) }; - Ok(Value::String(x.as_bytes()[beg..end].try_into()?)) + Ok(Value::String(NixString::new_inherit_context_from( + &x, + &x[beg..end], + ))) } #[builtin("tail")] |