@@ -629,53 +629,44 @@ where
629629
630630/// Allows zvals to be converted into Rust types in a fallible way. Reciprocal of the [`IntoZval`]
631631/// 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 {
636633 /// The corresponding type of the implemented value in PHP.
637634 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 > ;
638642}
639643
640644impl < ' a , T > FromZval < ' a > for Option < T >
641645where
642646 T : FromZval < ' a > ,
643647{
644648 const TYPE : DataType = T :: TYPE ;
645- }
646649
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) )
654652 }
655653}
656654
657655macro_rules! try_from_zval {
658656 ( $type: ty, $fn: ident, $dt: ident) => {
659- impl < ' a> FromZval <' a > for $type {
657+ impl FromZval <' _ > for $type {
660658 const TYPE : DataType = DataType :: $dt;
661- }
662-
663- impl TryFrom <& Zval > for $type {
664- type Error = Error ;
665659
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( ) )
671662 }
672663 }
673664
674665 impl TryFrom <Zval > for $type {
675666 type Error = Error ;
676667
677668 fn try_from( value: Zval ) -> Result <Self > {
678- ( & value) . try_into ( )
669+ Self :: from_zval ( & value) . ok_or ( Error :: ZvalConversion ( value . get_type ( ) ? ) )
679670 }
680671 }
681672 } ;
@@ -698,44 +689,27 @@ try_from_zval!(f64, double, Double);
698689try_from_zval ! ( bool , bool , Bool ) ;
699690try_from_zval ! ( String , string, String ) ;
700691
701- impl < ' a > FromZval < ' a > for f32 {
692+ impl FromZval < ' _ > for f32 {
702693 const TYPE : DataType = DataType :: Double ;
703- }
704-
705- impl < ' a > TryFrom < & ' a Zval > for f32 {
706- type Error = Error ;
707694
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 )
713697 }
714698}
715699
716700impl < ' a > FromZval < ' a > for & ' a str {
717701 const TYPE : DataType = DataType :: String ;
718- }
719-
720- impl < ' a > TryFrom < & ' a Zval > for & ' a str {
721- type Error = Error ;
722702
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 ( )
725705 }
726706}
727707
728708impl < ' a > FromZval < ' a > for ZendHashTable < ' a > {
729709 const TYPE : DataType = DataType :: Array ;
730- }
731-
732- impl < ' a > TryFrom < & ' a Zval > for ZendHashTable < ' a > {
733- type Error = Error ;
734710
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 ( )
739713 }
740714}
741715
@@ -744,19 +718,9 @@ where
744718 T : FromZval < ' a > ,
745719{
746720 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 ;
754721
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 ( ) )
760724 }
761725}
762726
@@ -779,19 +743,9 @@ where
779743 T : FromZval < ' a > ,
780744{
781745 const TYPE : DataType = DataType :: Array ;
782- }
783746
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 ( ) )
795749 }
796750}
797751
@@ -811,13 +765,9 @@ where
811765
812766impl < ' a > FromZval < ' a > for Callable < ' a > {
813767 const TYPE : DataType = DataType :: Callable ;
814- }
815-
816- impl < ' a > TryFrom < & ' a Zval > for Callable < ' a > {
817- type Error = Error ;
818768
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 ( )
821771 }
822772}
823773
0 commit comments