@@ -629,53 +629,44 @@ where
629
629
630
630
/// Allows zvals to be converted into Rust types in a fallible way. Reciprocal of the [`IntoZval`]
631
631
/// trait.
632
- ///
633
- /// This trait requires the [`TryFrom`] trait to be implemented. All this trait does is contain the
634
- /// type of data that is expected when parsing the value, which is used when parsing arguments.
635
- pub trait FromZval < ' a > : TryFrom < & ' a Zval > {
632
+ pub trait FromZval < ' a > : Sized {
636
633
/// The corresponding type of the implemented value in PHP.
637
634
const TYPE : DataType ;
635
+
636
+ /// Attempts to retrieve an instance of `Self` from a reference to a [`Zval`].
637
+ ///
638
+ /// # Parameters
639
+ ///
640
+ /// * `zval` - Zval to get value from.
641
+ fn from_zval ( zval : & ' a Zval ) -> Option < Self > ;
638
642
}
639
643
640
644
impl < ' a , T > FromZval < ' a > for Option < T >
641
645
where
642
646
T : FromZval < ' a > ,
643
647
{
644
648
const TYPE : DataType = T :: TYPE ;
645
- }
646
649
647
- // Converting to an option is infallible.
648
- impl < ' a , T > From < & ' a Zval > for Option < T >
649
- where
650
- T : FromZval < ' a > ,
651
- {
652
- fn from ( val : & ' a Zval ) -> Self {
653
- val. try_into ( ) . ok ( )
650
+ fn from_zval ( zval : & ' a Zval ) -> Option < Self > {
651
+ Some ( T :: from_zval ( zval) )
654
652
}
655
653
}
656
654
657
655
macro_rules! try_from_zval {
658
656
( $type: ty, $fn: ident, $dt: ident) => {
659
- impl < ' a> FromZval <' a > for $type {
657
+ impl FromZval <' _ > for $type {
660
658
const TYPE : DataType = DataType :: $dt;
661
- }
662
-
663
- impl TryFrom <& Zval > for $type {
664
- type Error = Error ;
665
659
666
- fn try_from( value: & Zval ) -> Result <Self > {
667
- value
668
- . $fn( )
669
- . and_then( |val| val. try_into( ) . ok( ) )
670
- . ok_or( Error :: ZvalConversion ( value. get_type( ) ?) )
660
+ fn from_zval( zval: & Zval ) -> Option <Self > {
661
+ zval. $fn( ) . and_then( |val| val. try_into( ) . ok( ) )
671
662
}
672
663
}
673
664
674
665
impl TryFrom <Zval > for $type {
675
666
type Error = Error ;
676
667
677
668
fn try_from( value: Zval ) -> Result <Self > {
678
- ( & value) . try_into ( )
669
+ Self :: from_zval ( & value) . ok_or ( Error :: ZvalConversion ( value . get_type ( ) ? ) )
679
670
}
680
671
}
681
672
} ;
@@ -698,44 +689,27 @@ try_from_zval!(f64, double, Double);
698
689
try_from_zval ! ( bool , bool , Bool ) ;
699
690
try_from_zval ! ( String , string, String ) ;
700
691
701
- impl < ' a > FromZval < ' a > for f32 {
692
+ impl FromZval < ' _ > for f32 {
702
693
const TYPE : DataType = DataType :: Double ;
703
- }
704
-
705
- impl < ' a > TryFrom < & ' a Zval > for f32 {
706
- type Error = Error ;
707
694
708
- fn try_from ( value : & ' a Zval ) -> Result < Self > {
709
- value
710
- . double ( )
711
- . map ( |v| v as f32 )
712
- . ok_or ( Error :: ZvalConversion ( value. get_type ( ) ?) )
695
+ fn from_zval ( zval : & Zval ) -> Option < Self > {
696
+ zval. double ( ) . map ( |v| v as f32 )
713
697
}
714
698
}
715
699
716
700
impl < ' a > FromZval < ' a > for & ' a str {
717
701
const TYPE : DataType = DataType :: String ;
718
- }
719
-
720
- impl < ' a > TryFrom < & ' a Zval > for & ' a str {
721
- type Error = Error ;
722
702
723
- fn try_from ( value : & ' a Zval ) -> Result < Self > {
724
- value . str ( ) . ok_or ( Error :: ZvalConversion ( value . get_type ( ) ? ) )
703
+ fn from_zval ( zval : & ' a Zval ) -> Option < Self > {
704
+ zval . str ( )
725
705
}
726
706
}
727
707
728
708
impl < ' a > FromZval < ' a > for ZendHashTable < ' a > {
729
709
const TYPE : DataType = DataType :: Array ;
730
- }
731
-
732
- impl < ' a > TryFrom < & ' a Zval > for ZendHashTable < ' a > {
733
- type Error = Error ;
734
710
735
- fn try_from ( value : & ' a Zval ) -> Result < Self > {
736
- value
737
- . array ( )
738
- . ok_or ( Error :: ZvalConversion ( value. get_type ( ) ?) )
711
+ fn from_zval ( zval : & ' a Zval ) -> Option < Self > {
712
+ zval. array ( )
739
713
}
740
714
}
741
715
@@ -744,19 +718,9 @@ where
744
718
T : FromZval < ' a > ,
745
719
{
746
720
const TYPE : DataType = DataType :: Array ;
747
- }
748
-
749
- impl < ' a , T > TryFrom < & ' a Zval > for Vec < T >
750
- where
751
- T : FromZval < ' a > ,
752
- {
753
- type Error = Error ;
754
721
755
- fn try_from ( value : & ' a Zval ) -> Result < Self > {
756
- value
757
- . array ( )
758
- . ok_or ( Error :: ZvalConversion ( value. get_type ( ) ?) ) ?
759
- . try_into ( )
722
+ fn from_zval ( zval : & ' a Zval ) -> Option < Self > {
723
+ zval. array ( ) . and_then ( |arr| arr. try_into ( ) . ok ( ) )
760
724
}
761
725
}
762
726
@@ -779,19 +743,9 @@ where
779
743
T : FromZval < ' a > ,
780
744
{
781
745
const TYPE : DataType = DataType :: Array ;
782
- }
783
746
784
- impl < ' a , T > TryFrom < & ' a Zval > for HashMap < String , T >
785
- where
786
- T : FromZval < ' a > ,
787
- {
788
- type Error = Error ;
789
-
790
- fn try_from ( value : & ' a Zval ) -> Result < Self > {
791
- value
792
- . array ( )
793
- . ok_or ( Error :: ZvalConversion ( value. get_type ( ) ?) ) ?
794
- . try_into ( )
747
+ fn from_zval ( zval : & ' a Zval ) -> Option < Self > {
748
+ zval. array ( ) . and_then ( |arr| arr. try_into ( ) . ok ( ) )
795
749
}
796
750
}
797
751
@@ -811,13 +765,9 @@ where
811
765
812
766
impl < ' a > FromZval < ' a > for Callable < ' a > {
813
767
const TYPE : DataType = DataType :: Callable ;
814
- }
815
-
816
- impl < ' a > TryFrom < & ' a Zval > for Callable < ' a > {
817
- type Error = Error ;
818
768
819
- fn try_from ( value : & ' a Zval ) -> Result < Self > {
820
- Callable :: new ( value )
769
+ fn from_zval ( zval : & ' a Zval ) -> Option < Self > {
770
+ Callable :: new ( zval ) . ok ( )
821
771
}
822
772
}
823
773
0 commit comments