From 778aa4e7dfd616743f3b9e18e10bb53f5d441f5f Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 9 May 2022 00:11:03 +0200 Subject: Mutable field access --- src/eval/mod.rs | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'src') 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> { 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> { + 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, -- cgit v1.2.3