diff options
| author | Michael Lohr <michael@lohr.dev> | 2023-05-03 12:34:35 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-03 12:34:35 +0200 |
| commit | ffad8516af0b91121dc0761c8026e0a12939a7d4 (patch) | |
| tree | ada5c6b5510b5f509997ccf5308a9cafc8618990 /src/eval/array.rs | |
| parent | ca8462642a96ec282afeb0774b6d5daf546ac236 (diff) | |
Implement default values for at() (#995)
Diffstat (limited to 'src/eval/array.rs')
| -rw-r--r-- | src/eval/array.rs | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/eval/array.rs b/src/eval/array.rs index f6e2f2d4..6ae5d7cf 100644 --- a/src/eval/array.rs +++ b/src/eval/array.rs @@ -74,10 +74,15 @@ impl Array { } /// Borrow the value at the given index. - pub fn at(&self, index: i64) -> StrResult<&Value> { + pub fn at<'a>( + &'a self, + index: i64, + default: Option<&'a Value>, + ) -> StrResult<&'a Value> { self.locate(index) .and_then(|i| self.0.get(i)) - .ok_or_else(|| out_of_bounds(index, self.len())) + .or(default) + .ok_or_else(|| out_of_bounds_no_default(index, self.len())) } /// Mutably borrow the value at the given index. @@ -85,7 +90,7 @@ impl Array { let len = self.len(); self.locate(index) .and_then(move |i| self.0.make_mut().get_mut(i)) - .ok_or_else(|| out_of_bounds(index, len)) + .ok_or_else(|| out_of_bounds_no_default(index, len)) } /// Push a value to the end of the array. @@ -462,3 +467,14 @@ fn array_is_empty() -> EcoString { fn out_of_bounds(index: i64, len: i64) -> EcoString { eco_format!("array index out of bounds (index: {}, len: {})", index, len) } + +/// The out of bounds access error message when no default value was given. +#[cold] +fn out_of_bounds_no_default(index: i64, len: i64) -> EcoString { + eco_format!( + "array index out of bounds (index: {}, len: {}) \ + and no default value was specified", + index, + len + ) +} |
