feat(tvix/eval): implement getContext primop

Change-Id: I2c5068a28f9883a01b0ff80a5e5ab32ba18bfc1a
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10437
Reviewed-by: tazjin <tazjin@tvl.su>
Autosubmit: raitobezarius <tvl@lahfa.xyz>
Tested-by: BuildkiteCI
This commit is contained in:
Ryan Lahfa 2023-12-26 02:18:33 +01:00 committed by clbot
parent 96d06031af
commit 09ec8b6fcf
3 changed files with 48 additions and 1 deletions

View file

@ -61,7 +61,7 @@ The `impl` column indicates implementation status in tvix:
| genList | false | | | |
| genericClosure | false | | | todo |
| getAttr | false | | | |
| getContext | false | | | context |
| getContext | false | | | |
| getEnv | false | | false | |
| hasAttr | false | | | |
| hasContext | false | | | |

View file

@ -23,6 +23,8 @@ use crate::{
value::{CoercionKind, NixAttrs, NixList, NixString, Thunk, Value},
};
use crate::NixContextElement;
use self::versions::{VersionPart, VersionPartsIter};
mod to_xml;
@ -581,6 +583,47 @@ mod pure_builtins {
Ok(Value::Bool(v.has_context()))
}
#[builtin("getContext")]
#[allow(non_snake_case)]
async fn builtin_getContext(co: GenCo, e: Value) -> Result<Value, ErrorKind> {
// also forces the value
let span = generators::request_span(&co).await;
let v = e
.coerce_to_string(
co,
CoercionKind {
strong: true,
import_paths: true,
},
span,
)
.await?;
let s = v.to_contextful_str()?;
let elements = s
.iter_context()
.flat_map(|context| context.iter())
.map(|ctx_element| match ctx_element {
NixContextElement::Plain(spath) => (
spath.clone(),
Value::attrs(NixAttrs::from_iter([("path", true)])),
),
NixContextElement::Single { name, derivation } => (
derivation.clone(),
Value::attrs(NixAttrs::from_iter([(
"outputs",
Value::List(NixList::construct(1, vec![name.clone().into()])),
)])),
),
NixContextElement::Derivation(drv_path) => (
drv_path.clone(),
Value::attrs(NixAttrs::from_iter([("allOutputs", true)])),
),
});
Ok(Value::attrs(NixAttrs::from_iter(elements)))
}
#[builtin("hashString")]
#[allow(non_snake_case)]
async fn builtin_hashString(

View file

@ -326,6 +326,10 @@ impl NixString {
return self.1.as_mut();
}
pub fn iter_context(&self) -> impl Iterator<Item = &NixContext> {
return self.1.iter();
}
pub fn iter_plain(&self) -> impl Iterator<Item = &str> {
return self.1.iter().flat_map(|context| context.iter_plain());
}