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 | | | |
|
| genList | false | | | |
|
||||||
| genericClosure | false | | | todo |
|
| genericClosure | false | | | todo |
|
||||||
| getAttr | false | | | |
|
| getAttr | false | | | |
|
||||||
| getContext | false | | | context |
|
| getContext | false | | | |
|
||||||
| getEnv | false | | false | |
|
| getEnv | false | | false | |
|
||||||
| hasAttr | false | | | |
|
| hasAttr | false | | | |
|
||||||
| hasContext | false | | | |
|
| hasContext | false | | | |
|
||||||
|
|
|
@ -23,6 +23,8 @@ use crate::{
|
||||||
value::{CoercionKind, NixAttrs, NixList, NixString, Thunk, Value},
|
value::{CoercionKind, NixAttrs, NixList, NixString, Thunk, Value},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::NixContextElement;
|
||||||
|
|
||||||
use self::versions::{VersionPart, VersionPartsIter};
|
use self::versions::{VersionPart, VersionPartsIter};
|
||||||
|
|
||||||
mod to_xml;
|
mod to_xml;
|
||||||
|
@ -581,6 +583,47 @@ mod pure_builtins {
|
||||||
Ok(Value::Bool(v.has_context()))
|
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")]
|
#[builtin("hashString")]
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
async fn builtin_hashString(
|
async fn builtin_hashString(
|
||||||
|
|
|
@ -326,6 +326,10 @@ impl NixString {
|
||||||
return self.1.as_mut();
|
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> {
|
pub fn iter_plain(&self) -> impl Iterator<Item = &str> {
|
||||||
return self.1.iter().flat_map(|context| context.iter_plain());
|
return self.1.iter().flat_map(|context| context.iter_plain());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue