summaryrefslogtreecommitdiff
path: root/src/eval/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/mod.rs')
-rw-r--r--src/eval/mod.rs25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index 0021b93c..db50ee82 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -1000,8 +1000,9 @@ impl Access for Expr {
scp: &'a mut Scopes,
) -> TypResult<Location<'a>> {
match self {
- Expr::Ident(ident) => ident.access(ctx, scp),
- Expr::FuncCall(call) => call.access(ctx, scp),
+ Expr::Ident(v) => v.access(ctx, scp),
+ Expr::FieldAccess(v) => v.access(ctx, scp),
+ Expr::FuncCall(v) => v.access(ctx, scp),
_ => bail!(self.span(), "cannot mutate a temporary value"),
}
}
@@ -1023,6 +1024,26 @@ impl Access for Ident {
}
}
+impl Access for FieldAccess {
+ fn access<'a>(
+ &self,
+ ctx: &mut Context,
+ scp: &'a mut Scopes,
+ ) -> TypResult<Location<'a>> {
+ let guard = self.object().access(ctx, scp)?;
+ try_map(guard, |value| {
+ Ok(match value {
+ Value::Dict(dict) => dict.get_mut(self.field().take()),
+ v => bail!(
+ self.object().span(),
+ "expected dictionary, found {}",
+ v.type_name(),
+ ),
+ })
+ })
+ }
+}
+
impl Access for FuncCall {
fn access<'a>(
&self,