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:
parent
e834a2cbc4
commit
067f2b16f6
4 changed files with 48 additions and 1 deletions
|
@ -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)?;
|
||||
}
|
||||
|
|
|
@ -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> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue