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:
parent
96d06031af
commit
09ec8b6fcf
3 changed files with 48 additions and 1 deletions
|
@ -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 | | | |
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue