feat(tvix/eval): implement Value::coerce_to_path()

This function is necessary for all builtins that expect some form of
path as an argument. It is merely a wrapper around coerce_to_string that
can shortcut if we already have a path. The absolute path check is done
in the same way as in C++ Nix for compatibility, although it should
probably be revised in the long term (think about Windows, for example).

Since coercing to a path is not an operation possible in the language
directly, this function can live in the builtins module as the only
place it is required.

Change-Id: I69ed5455c00d193fea88b8fa83e28907a761cab5
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6574
Autosubmit: sterni <sternenseemann@systemli.org>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
sterni 2022-09-13 20:11:07 +02:00 committed by clbot
parent e834a2cbc4
commit 067f2b16f6
4 changed files with 48 additions and 1 deletions

View file

@ -101,6 +101,8 @@ impl Value {
kind: CoercionKind,
vm: &mut VM,
) -> Result<NixString, ErrorKind> {
// TODO: eventually, this will need to handle string context and importing
// files into the Nix store depending on what context the coercion happens in
if let Value::Thunk(t) = self {
t.force(vm)?;
}

View file

@ -2,7 +2,7 @@
//! backing implementations.
use smol_str::SmolStr;
use std::hash::Hash;
use std::{borrow::Cow, fmt::Display};
use std::{borrow::Cow, fmt::Display, str::Chars};
#[derive(Clone, Debug)]
enum StringRepr {
@ -97,6 +97,13 @@ impl NixString {
s.push_str(other.as_str());
NixString(StringRepr::Heap(s))
}
pub fn chars(&self) -> Chars<'_> {
match &self.0 {
StringRepr::Heap(h) => h.chars(),
StringRepr::Smol(s) => s.chars(),
}
}
}
fn nix_escape_char(ch: char, next: Option<&char>) -> Option<&'static str> {