Skip to content

Commit 5449502

Browse files
authored
feat(is_scalar): Zval::is_scalar() #237 (#614)
1 parent 78939fc commit 5449502

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

src/types/zval.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ impl Zval {
6363
zval
6464
}
6565

66+
/// Creates a zval containing an empty array.
67+
#[must_use]
68+
pub fn new_array() -> Zval {
69+
let mut zval = Zval::new();
70+
zval.set_hashtable(ZendHashTable::new());
71+
zval
72+
}
73+
6674
/// Dereference the zval, if it is a reference.
6775
#[must_use]
6876
pub fn dereference(&self) -> &Self {
@@ -489,6 +497,18 @@ impl Zval {
489497
self.get_type() == DataType::Ptr
490498
}
491499

500+
/// Returns true if the zval is a scalar value (integer, float, string, or bool),
501+
/// false otherwise.
502+
///
503+
/// This is equivalent to PHP's `is_scalar()` function.
504+
#[must_use]
505+
pub fn is_scalar(&self) -> bool {
506+
matches!(
507+
self.get_type(),
508+
DataType::Long | DataType::Double | DataType::String | DataType::True | DataType::False
509+
)
510+
}
511+
492512
/// Sets the value of the zval as a string. Returns nothing in a result when
493513
/// successful.
494514
///
@@ -852,4 +872,39 @@ mod tests {
852872
assert!(zval.is_null());
853873
});
854874
}
875+
876+
#[test]
877+
fn test_is_scalar() {
878+
Embed::run(|| {
879+
// Test scalar types - should return true
880+
let mut zval_long = Zval::new();
881+
zval_long.set_long(42);
882+
assert!(zval_long.is_scalar());
883+
884+
let mut zval_double = Zval::new();
885+
zval_double.set_double(1.5);
886+
assert!(zval_double.is_scalar());
887+
888+
let mut zval_true = Zval::new();
889+
zval_true.set_bool(true);
890+
assert!(zval_true.is_scalar());
891+
892+
let mut zval_false = Zval::new();
893+
zval_false.set_bool(false);
894+
assert!(zval_false.is_scalar());
895+
896+
let mut zval_string = Zval::new();
897+
zval_string
898+
.set_string("hello", false)
899+
.expect("set_string should succeed");
900+
assert!(zval_string.is_scalar());
901+
902+
// Test non-scalar types - should return false
903+
let zval_null = Zval::null();
904+
assert!(!zval_null.is_scalar());
905+
906+
let zval_array = Zval::new_array();
907+
assert!(!zval_array.is_scalar());
908+
});
909+
}
855910
}

0 commit comments

Comments
 (0)