@@ -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