Skip to content

Commit cedb7ab

Browse files
committed
feat(is_scalar): Zval::is_scalar() #237
1 parent 6b192e8 commit cedb7ab

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/types/zval.rs

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

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

499+
/// Returns true if the zval is a scalar value (integer, float, string, or bool),
500+
/// false otherwise.
501+
///
502+
/// This is equivalent to PHP's `is_scalar()` function.
503+
#[must_use]
504+
pub fn is_scalar(&self) -> bool {
505+
matches!(
506+
self.get_type(),
507+
DataType::Long | DataType::Double | DataType::String | DataType::True | DataType::False
508+
)
509+
}
510+
491511
/// Sets the value of the zval as a string. Returns nothing in a result when
492512
/// successful.
493513
///
@@ -812,4 +832,37 @@ mod tests {
812832
assert!(zval.is_null());
813833
});
814834
}
835+
836+
#[test]
837+
fn test_is_scalar() {
838+
Embed::run(|| {
839+
// Test scalar types - should return true
840+
let mut zval_long = Zval::new();
841+
zval_long.set_long(42);
842+
assert!(zval_long.is_scalar());
843+
844+
let mut zval_double = Zval::new();
845+
zval_double.set_double(1.5);
846+
assert!(zval_double.is_scalar());
847+
848+
let mut zval_true = Zval::new();
849+
zval_true.set_bool(true);
850+
assert!(zval_true.is_scalar());
851+
852+
let mut zval_false = Zval::new();
853+
zval_false.set_bool(false);
854+
assert!(zval_false.is_scalar());
855+
856+
let mut zval_string = Zval::new();
857+
zval_string.set_string("hello", false).expect("set_string should succeed");
858+
assert!(zval_string.is_scalar());
859+
860+
// Test non-scalar types - should return false
861+
let zval_null = Zval::null();
862+
assert!(!zval_null.is_scalar());
863+
864+
let zval_array = Zval::new_array();
865+
assert!(!zval_array.is_scalar());
866+
});
867+
}
815868
}

tests/sapi.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ fn test_sapi_multithread() {
166166
Ok(zval) => {
167167
assert!(zval.is_string());
168168
let string = zval.string().unwrap();
169-
let output = string.to_string();
169+
let output = string.clone();
170170
assert_eq!(output, format!("Hello, thread-{i}!"));
171171

172172
results.lock().unwrap().push((i, output));

0 commit comments

Comments
 (0)