summaryrefslogtreecommitdiff
path: root/src/eval/mod.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-04-19 16:37:16 +0200
committerLaurenz <laurmaedje@gmail.com>2022-04-19 16:37:16 +0200
commit7a2cc3e7d29d16c5cf9b5a93a688e14da93c8662 (patch)
tree8ca787c56b84b83f5d34ee7b4701c0e8f4778753 /src/eval/mod.rs
parent255d4c620f39133b40a9132843781f2a620a6008 (diff)
Field access
Diffstat (limited to 'src/eval/mod.rs')
-rw-r--r--src/eval/mod.rs28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index 4a616b58..d9651cce 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -215,6 +215,7 @@ impl Eval for Expr {
Self::Array(v) => v.eval(ctx, scp).map(Value::Array),
Self::Dict(v) => v.eval(ctx, scp).map(Value::Dict),
Self::Group(v) => v.eval(ctx, scp),
+ Self::FieldAccess(v) => v.eval(ctx, scp),
Self::FuncCall(v) => v.eval(ctx, scp),
Self::MethodCall(v) => v.eval(ctx, scp),
Self::Closure(v) => v.eval(ctx, scp),
@@ -434,6 +435,23 @@ impl BinaryExpr {
}
}
+impl Eval for FieldAccess {
+ type Output = Value;
+
+ fn eval(&self, ctx: &mut Context, scp: &mut Scopes) -> EvalResult<Self::Output> {
+ let object = self.object().eval(ctx, scp)?;
+ Ok(match object {
+ Value::Dict(dict) => dict.get(self.field().take()).at(self.span())?.clone(),
+
+ v => bail!(
+ self.object().span(),
+ "cannot access field on {}",
+ v.type_name()
+ ),
+ })
+ }
+}
+
impl Eval for FuncCall {
type Output = Value;
@@ -442,14 +460,8 @@ impl Eval for FuncCall {
let args = self.args().eval(ctx, scp)?;
Ok(match callee {
- Value::Array(array) => {
- array.get(args.into_index()?).map(Value::clone).at(self.span())?
- }
-
- Value::Dict(dict) => {
- dict.get(args.into_key()?).map(Value::clone).at(self.span())?
- }
-
+ Value::Array(array) => array.get(args.into_index()?).at(self.span())?.clone(),
+ Value::Dict(dict) => dict.get(args.into_key()?).at(self.span())?.clone(),
Value::Func(func) => {
let point = || Tracepoint::Call(func.name().map(ToString::to_string));
func.call(ctx, args).trace(point, self.span())?