diff options
author | Vincent Ambo <mail@tazj.in> | 2022-08-11T12·29+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-08-26T09·02+0000 |
commit | 20f5ccefeb88ce4b79369085977b674c612e8fed (patch) | |
tree | b76f0bea439f792bc0f092f81e8871354c31b75b /tvix/eval/src/value/attrs.rs | |
parent | 671915837aee2908431b1d1908352fc0ab9cd628 (diff) |
feat(tvix/eval): implement attribute set access operator r/4492
Fairly straightforward, handling the optimised representations manually and otherwise delegating to BTreeMap. Note that parsing of raw identifiers is not yet implemented. Encountering an identifier node usually means that there is locals access going on, so we need a special case for compiling a node in such a way that an identifier's literal value ends up on the stack. Change-Id: I13fbab7ac657b17ef3f4c5859fe737c321890c8a Reviewed-on: https://cl.tvl.fyi/c/depot/+/6158 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org> Reviewed-by: grfn <grfn@gws.fyi>
Diffstat (limited to 'tvix/eval/src/value/attrs.rs')
-rw-r--r-- | tvix/eval/src/value/attrs.rs | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/tvix/eval/src/value/attrs.rs b/tvix/eval/src/value/attrs.rs index 9204a5bb955a..ecb819fad77c 100644 --- a/tvix/eval/src/value/attrs.rs +++ b/tvix/eval/src/value/attrs.rs @@ -45,6 +45,26 @@ impl AttrsRep { } } } + + fn select(&self, key: &str) -> Option<&Value> { + match self { + AttrsRep::Empty => None, + + AttrsRep::KV { name, value } => { + if key == "name" { + return Some(&name); + } + + if key == "value" { + return Some(&value); + } + + None + } + + AttrsRep::Map(map) => map.get(&key.to_string().into()), + } + } } #[derive(Clone, Debug)] @@ -133,6 +153,11 @@ impl NixAttrs { } } + // Select a value from an attribute set by key. + pub fn select(&self, key: &str) -> Option<&Value> { + self.0.select(key) + } + /// Implement construction logic of an attribute set, to encapsulate /// logic about attribute set optimisations inside of this module. pub fn construct(count: usize, mut stack_slice: Vec<Value>) -> EvalResult<Self> { |