Skip to content

Commit d4c6aa2

Browse files
Replaced manual TryFrom implementations with macro (#24)
* Updated traits for building Zval * Replaced manual implementations with macro impl
1 parent 815452f commit d4c6aa2

File tree

1 file changed

+59
-82
lines changed

1 file changed

+59
-82
lines changed

src/php/types/zval.rs

Lines changed: 59 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,8 @@ impl<'a> Zval {
288288
/// # Parameters
289289
///
290290
/// * `val` - The value to set the zval as.
291-
pub fn set_long(&mut self, val: ZendLong) {
292-
self.value.lval = val;
291+
pub fn set_long<T: Into<ZendLong>>(&mut self, val: T) {
292+
self.value.lval = val.into();
293293
self.u1.type_info = DataType::Long as u32;
294294
}
295295

@@ -298,8 +298,8 @@ impl<'a> Zval {
298298
/// # Parameters
299299
///
300300
/// * `val` - The value to set the zval as.
301-
pub fn set_double(&mut self, val: f64) {
302-
self.value.dval = val;
301+
pub fn set_double<T: Into<libc::c_double>>(&mut self, val: T) {
302+
self.value.dval = val.into();
303303
self.u1.type_info = DataType::Double as u32;
304304
}
305305

@@ -308,8 +308,8 @@ impl<'a> Zval {
308308
/// # Parameters
309309
///
310310
/// * `val` - The value to set the zval as.
311-
pub fn set_bool(&mut self, val: bool) {
312-
self.u1.type_info = if val {
311+
pub fn set_bool<T: Into<bool>>(&mut self, val: T) {
312+
self.u1.type_info = if val.into() {
313313
DataType::True as u32
314314
} else {
315315
DataType::False as u32
@@ -357,91 +357,68 @@ impl<'a> Zval {
357357
}
358358
}
359359

360-
impl TryFrom<&Zval> for ZendLong {
361-
type Error = ();
362-
fn try_from(value: &Zval) -> Result<Self, Self::Error> {
363-
match value.long() {
364-
Some(val) => Ok(val),
365-
_ => Err(()),
360+
#[macro_use]
361+
macro_rules! try_from_zval {
362+
($type: ty, $fn: ident) => {
363+
impl TryFrom<&Zval> for $type {
364+
type Error = ();
365+
fn try_from(value: &Zval) -> Result<Self, Self::Error> {
366+
match value.$fn() {
367+
Some(v) => <$type>::try_from(v).map_err(|_| ()),
368+
_ => Err(()),
369+
}
370+
}
366371
}
367-
}
372+
};
368373
}
369374

370-
impl TryFrom<&Zval> for bool {
371-
type Error = ();
372-
fn try_from(value: &Zval) -> Result<Self, Self::Error> {
373-
match value.bool() {
374-
Some(val) => Ok(val),
375-
_ => Err(()),
376-
}
377-
}
378-
}
375+
try_from_zval!(i8, long);
376+
try_from_zval!(i16, long);
377+
try_from_zval!(i32, long);
378+
try_from_zval!(i64, long);
379379

380-
impl TryFrom<&Zval> for f64 {
381-
type Error = ();
382-
fn try_from(value: &Zval) -> Result<Self, Self::Error> {
383-
match value.double() {
384-
Some(val) => Ok(val),
385-
_ => Err(()),
386-
}
387-
}
388-
}
380+
try_from_zval!(u8, long);
381+
try_from_zval!(u16, long);
382+
try_from_zval!(u32, long);
383+
try_from_zval!(u64, long);
389384

390-
impl TryFrom<&Zval> for String {
391-
type Error = ();
392-
fn try_from(value: &Zval) -> Result<Self, Self::Error> {
393-
match value.string() {
394-
Some(val) => Ok(val),
395-
_ => Err(()),
396-
}
397-
}
398-
}
385+
try_from_zval!(usize, long);
386+
try_from_zval!(isize, long);
387+
388+
try_from_zval!(f64, double);
389+
390+
try_from_zval!(bool, bool);
399391

400-
impl<'a, 'b> TryFrom<&'b Zval> for ZendHashTable {
401-
type Error = ();
402-
fn try_from(value: &'b Zval) -> Result<Self, Self::Error> {
403-
match value.array() {
404-
Some(val) => Ok(val),
405-
_ => Err(()),
392+
try_from_zval!(String, string);
393+
394+
/// Implements the trait `Into<T>` on Zval for a given type.
395+
#[macro_use]
396+
macro_rules! into_zval {
397+
($type: ty, $fn: ident) => {
398+
impl From<$type> for Zval {
399+
fn from(val: $type) -> Self {
400+
let mut zv = Self::new();
401+
zv.$fn(val);
402+
zv
403+
}
406404
}
407-
}
405+
};
408406
}
409407

410-
impl From<ZendLong> for Zval {
411-
fn from(val: ZendLong) -> Self {
412-
let mut zv = Self::new();
413-
zv.set_long(val);
414-
zv
415-
}
416-
}
408+
into_zval!(i8, set_long);
409+
into_zval!(i16, set_long);
410+
into_zval!(i32, set_long);
411+
into_zval!(i64, set_long);
417412

418-
impl From<bool> for Zval {
419-
fn from(val: bool) -> Self {
420-
let mut zv = Self::new();
421-
zv.set_bool(val);
422-
zv
423-
}
424-
}
425-
impl From<f64> for Zval {
426-
fn from(val: f64) -> Self {
427-
let mut zv = Self::new();
428-
zv.set_double(val);
429-
zv
430-
}
431-
}
413+
into_zval!(u8, set_long);
414+
into_zval!(u16, set_long);
415+
into_zval!(u32, set_long);
432416

433-
impl From<String> for Zval {
434-
fn from(val: String) -> Self {
435-
let mut zv = Self::new();
436-
zv.set_string(val);
437-
zv
438-
}
439-
}
417+
into_zval!(f32, set_double);
418+
into_zval!(f64, set_double);
440419

441-
impl From<&str> for Zval {
442-
fn from(val: &str) -> Self {
443-
let mut zv = Self::new();
444-
zv.set_string(val);
445-
zv
446-
}
447-
}
420+
into_zval!(bool, set_bool);
421+
422+
into_zval!(String, set_string);
423+
into_zval!(&String, set_string);
424+
into_zval!(&str, set_string);

0 commit comments

Comments
 (0)