aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-php-shim/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe-php-shim/src')
-rw-r--r--crates/shirabe-php-shim/src/array.rs24
-rw-r--r--crates/shirabe-php-shim/src/lib.rs10
2 files changed, 23 insertions, 11 deletions
diff --git a/crates/shirabe-php-shim/src/array.rs b/crates/shirabe-php-shim/src/array.rs
index 29338aae..86a78dd2 100644
--- a/crates/shirabe-php-shim/src/array.rs
+++ b/crates/shirabe-php-shim/src/array.rs
@@ -585,18 +585,20 @@ fn php_slice_bounds(len: i64, offset: i64, length: Option<i64>) -> (usize, usize
(start as usize, end as usize)
}
-pub fn in_array(needle: PhpMixed, haystack: &PhpMixed, strict: bool) -> bool {
- let values: Vec<&PhpMixed> = match haystack {
- PhpMixed::List(items) => items.iter().collect(),
- PhpMixed::Array(map) => map.values().collect(),
- _ => return false,
- };
+pub fn in_array_strict<'a>(
+ needle: impl Into<PhpMixed>,
+ haystack: impl IntoIterator<Item = &'a PhpMixed>,
+) -> bool {
+ let needle = needle.into();
+ haystack.into_iter().any(|value| *value == needle)
+}
- if strict {
- values.iter().any(|value| **value == needle)
- } else {
- values.iter().any(|value| loose_eq(value, &needle))
- }
+pub fn in_array_loose<'a>(
+ needle: impl Into<PhpMixed>,
+ haystack: impl IntoIterator<Item = &'a PhpMixed>,
+) -> bool {
+ let needle = needle.into();
+ haystack.into_iter().any(|value| loose_eq(value, &needle))
}
/// PHP numeric-string-aware conversion to a number, used by loose comparison.
diff --git a/crates/shirabe-php-shim/src/lib.rs b/crates/shirabe-php-shim/src/lib.rs
index 62287c23..7d22633c 100644
--- a/crates/shirabe-php-shim/src/lib.rs
+++ b/crates/shirabe-php-shim/src/lib.rs
@@ -209,6 +209,16 @@ impl PhpMixed {
}
}
+ /// Values of an array in insertion order. Panics on non-array values, mirroring the TypeError
+ /// PHP raises when an array is expected.
+ pub fn values(&self) -> Vec<&PhpMixed> {
+ match self {
+ PhpMixed::List(l) => l.iter().collect(),
+ PhpMixed::Array(a) | PhpMixed::Object(a) => a.values().collect(),
+ other => panic!("expected an array, got {:?}", other),
+ }
+ }
+
pub fn is_null(&self) -> bool {
matches!(self, PhpMixed::Null)
}