summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-12-21 23:48:04 +0100
committerLaurenz <laurmaedje@gmail.com>2022-12-21 23:48:04 +0100
commit1eda162867afab656ec9b95c85f725cd676d4f04 (patch)
treee349d3ddb709701c9997fead0869c5390fbb3ec4 /src
parent038f9b015ee1248c3636c5e1b2edb5c4767ed837 (diff)
Mutable methods with return values
Diffstat (limited to 'src')
-rw-r--r--src/model/array.rs5
-rw-r--r--src/model/dict.rs6
-rw-r--r--src/model/eval.rs2
-rw-r--r--src/model/methods.rs11
4 files changed, 13 insertions, 11 deletions
diff --git a/src/model/array.rs b/src/model/array.rs
index 06d1b588..02607547 100644
--- a/src/model/array.rs
+++ b/src/model/array.rs
@@ -93,15 +93,14 @@ impl Array {
}
/// Remove and return the value at the specified index.
- pub fn remove(&mut self, index: i64) -> StrResult<()> {
+ pub fn remove(&mut self, index: i64) -> StrResult<Value> {
let len = self.len();
let i = self
.locate(index)
.filter(|&i| i < self.0.len())
.ok_or_else(|| out_of_bounds(index, len))?;
- Arc::make_mut(&mut self.0).remove(i);
- Ok(())
+ Ok(Arc::make_mut(&mut self.0).remove(i))
}
/// Extract a contigous subregion of the array.
diff --git a/src/model/dict.rs b/src/model/dict.rs
index 6e014d7e..e3c5454e 100644
--- a/src/model/dict.rs
+++ b/src/model/dict.rs
@@ -79,10 +79,10 @@ impl Dict {
Arc::make_mut(&mut self.0).insert(key, value);
}
- /// Remove a mapping by `key`.
- pub fn remove(&mut self, key: &str) -> StrResult<()> {
+ /// Remove a mapping by `key` and return the value.
+ pub fn remove(&mut self, key: &str) -> StrResult<Value> {
match Arc::make_mut(&mut self.0).remove(key) {
- Some(_) => Ok(()),
+ Some(value) => Ok(value),
None => Err(missing_key(key)),
}
}
diff --git a/src/model/eval.rs b/src/model/eval.rs
index 3223ef8f..6ad27d6e 100644
--- a/src/model/eval.rs
+++ b/src/model/eval.rs
@@ -816,7 +816,7 @@ impl Eval for ast::MethodCall {
let result = if methods::is_mutating(&method) {
let args = self.args().eval(vm)?;
let value = self.target().access(vm)?;
- methods::call_mut(value, &method, args, span).map(|()| Value::None)
+ methods::call_mut(value, &method, args, span)
} else {
let value = self.target().eval(vm)?;
let args = self.args().eval(vm)?;
diff --git a/src/model/methods.rs b/src/model/methods.rs
index fc33bea9..dac36be2 100644
--- a/src/model/methods.rs
+++ b/src/model/methods.rs
@@ -128,9 +128,10 @@ pub fn call_mut(
method: &str,
mut args: Args,
span: Span,
-) -> SourceResult<()> {
+) -> SourceResult<Value> {
let name = value.type_name();
let missing = || Err(missing_method(name, method)).at(span);
+ let mut output = Value::None;
match value {
Value::Array(array) => match method {
@@ -139,12 +140,14 @@ pub fn call_mut(
"insert" => {
array.insert(args.expect("index")?, args.expect("value")?).at(span)?
}
- "remove" => array.remove(args.expect("index")?).at(span)?,
+ "remove" => output = array.remove(args.expect("index")?).at(span)?,
_ => return missing(),
},
Value::Dict(dict) => match method {
- "remove" => dict.remove(&args.expect::<EcoString>("key")?).at(span)?,
+ "remove" => {
+ output = dict.remove(&args.expect::<EcoString>("key")?).at(span)?
+ }
_ => return missing(),
},
@@ -152,7 +155,7 @@ pub fn call_mut(
}
args.finish()?;
- Ok(())
+ Ok(output)
}
/// Whether a specific method is mutating.