#[macro_export]
macro_rules! info_table_start {
() => {
unsafe { $crate::bindings::php_info_print_table_start() };
};
}
#[macro_export]
macro_rules! info_table_end {
() => {
unsafe { $crate::bindings::php_info_print_table_end() }
};
}
#[macro_export]
macro_rules! info_table_header {
($($element:expr),*) => {$crate::_info_table_row!(php_info_print_table_header, $($element),*)};
}
#[macro_export]
macro_rules! info_table_row {
($($element:expr),*) => {$crate::_info_table_row!(php_info_print_table_row, $($element),*)};
}
#[doc(hidden)]
#[macro_export]
macro_rules! _info_table_row {
($fn: ident, $($element: expr),*) => {
unsafe {
$crate::bindings::$fn($crate::_info_table_row!(@COUNT; $($element),*) as i32, $(::std::ffi::CString::new($element).unwrap().as_ptr()),*);
}
};
(@COUNT; $($element: expr),*) => {
<[()]>::len(&[$($crate::_info_table_row![@SUBST; $element]),*])
};
(@SUBST; $_: expr) => { () };
}
#[macro_export]
macro_rules! call_user_func {
($fn: expr) => {
$fn.try_call(vec![])
};
($fn: expr, $($param: expr),*) => {
$fn.try_call(vec![$(&$param),*])
};
}
#[macro_export]
macro_rules! parse_args {
($ed: expr, $($arg: expr),*) => {{
let parser = $ed.parser()
$(.arg(&mut $arg))*
.parse();
if parser.is_err() {
return;
}
}};
($ed: expr, $($arg: expr),* ; $($opt: expr),*) => {{
use $crate::php::args::ArgParser;
let parser = $ed.parser()
$(.arg(&mut $arg))*
.not_required()
$(.arg(&mut $opt))*
.parse();
if parser.is_err() {
return;
}
}};
}
#[macro_export]
macro_rules! throw {
($ex: expr, $reason: expr) => {
$crate::php::exceptions::throw($ex, $reason);
return;
};
}
#[macro_export]
macro_rules! class_derives {
($type: ty) => {
impl<'a> $crate::php::types::object::FromZendObject<'a> for &'a $type {
#[inline]
fn from_zend_object(
obj: &'a $crate::php::types::object::ZendObject,
) -> $crate::errors::Result<Self> {
let obj = $crate::php::types::object::ZendClassObject::<$type>::from_zend_obj(obj)
.ok_or($crate::errors::Error::InvalidScope)?;
Ok(&**obj)
}
}
impl<'a> $crate::php::types::object::FromZendObjectMut<'a> for &'a mut $type {
#[inline]
fn from_zend_object_mut(
obj: &'a mut $crate::php::types::object::ZendObject,
) -> $crate::errors::Result<Self> {
let obj =
$crate::php::types::object::ZendClassObject::<$type>::from_zend_obj_mut(obj)
.ok_or($crate::errors::Error::InvalidScope)?;
Ok(&mut **obj)
}
}
impl<'a> $crate::php::types::zval::FromZval<'a> for &'a $type {
const TYPE: $crate::php::enums::DataType = $crate::php::enums::DataType::Object(Some(
<$type as $crate::php::types::object::RegisteredClass>::CLASS_NAME,
));
#[inline]
fn from_zval(zval: &'a $crate::php::types::zval::Zval) -> ::std::option::Option<Self> {
<Self as $crate::php::types::object::FromZendObject>::from_zend_object(
zval.object()?,
)
.ok()
}
}
impl<'a> $crate::php::types::zval::FromZvalMut<'a> for &'a mut $type {
const TYPE: $crate::php::enums::DataType = $crate::php::enums::DataType::Object(Some(
<$type as $crate::php::types::object::RegisteredClass>::CLASS_NAME,
));
#[inline]
fn from_zval_mut(
zval: &'a mut $crate::php::types::zval::Zval,
) -> ::std::option::Option<Self> {
<Self as $crate::php::types::object::FromZendObjectMut>::from_zend_object_mut(
zval.object_mut()?,
)
.ok()
}
}
impl $crate::php::types::object::IntoZendObject for $type {
#[inline]
fn into_zend_object(
self,
) -> $crate::errors::Result<
$crate::php::boxed::ZBox<$crate::php::types::object::ZendObject>,
> {
Ok($crate::php::types::object::ZendClassObject::new(self).into())
}
}
impl $crate::php::types::zval::IntoZval for $type {
const TYPE: $crate::php::enums::DataType = $crate::php::enums::DataType::Object(Some(
<$type as $crate::php::types::object::RegisteredClass>::CLASS_NAME,
));
#[inline]
fn set_zval(
self,
zv: &mut $crate::php::types::zval::Zval,
persistent: bool,
) -> $crate::errors::Result<()> {
use $crate::php::types::object::IntoZendObject;
self.into_zend_object()?.set_zval(zv, persistent)
}
}
};
}