1- //! Implementation of [Request]
1+ //! A mechanism to allow providing values of arbitrary types for errors
22
33use crate :: any:: TypeId ;
44use crate :: error:: Error ;
@@ -8,6 +8,9 @@ use crate::ptr::NonNull;
88
99/// Requests a value of type `T` from the given `impl Error`.
1010///
11+ /// If you are getting many different types from the same error, you
12+ /// might get better performance using [MultiRequestBuilder].
13+ ///
1114/// # Examples
1215///
1316/// Get a string value from an error.
3134
3235/// Requests a reference of type `T` from the given `impl Error`.
3336///
37+ /// If you are getting many different types from the same error, you
38+ /// might get better performance using [MultiRequestBuilder].
39+ ///
3440/// # Examples
3541///
3642/// Get a string reference from an error.
@@ -506,26 +512,26 @@ impl<'a> Request<'a> {
506512 }
507513}
508514
509- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
515+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
510516impl < ' a > Debug for Request < ' a > {
511517 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> fmt:: Result {
512518 f. debug_struct ( "Request" ) . finish_non_exhaustive ( )
513519 }
514520}
515521
516522/// Base case for [IntoMultiRequest].
517- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
523+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
518524#[ derive( Copy , Clone , Debug ) ]
519525pub struct EmptyMultiRequestBuilder ;
520526
521527/// Case of [IntoMultiRequest] that retrieves a type by value.
522528///
523529/// Create via [MultiRequestBuilder::with_value].
524- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
530+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
525531#[ derive( Copy , Clone , Debug ) ]
526532pub struct ChainValMultiRequestBuilder < T , NEXT > ( PhantomData < ( T , NEXT ) > ) ;
527533
528- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
534+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
529535/// Case of [IntoMultiRequest] that retrieves a type by value.
530536///
531537/// Create via [MultiRequestBuilder::with_ref].
@@ -536,23 +542,23 @@ pub struct ChainRefMultiRequestBuilder<T: ?Sized, NEXT>(PhantomData<(*const T, N
536542/// traits in parallel.
537543///
538544/// There is no need to use this trait directly, use [MultiRequestBuilder] instead.
539- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
545+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
540546#[ allow( private_bounds) ]
541547pub trait IntoMultiRequest : private:: IntoMultiRequestInner + ' static { }
542548
543549mod private {
544- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
550+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
545551 #[ allow( private_bounds) ]
546552 pub trait IntoMultiRequestInner {
547- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
553+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
548554 type Request < ' a > : super :: Erased < ' a > + MultiResponseInner < ' a >
549555 where
550556 Self : ' a ;
551- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
557+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
552558 fn get_request < ' a > ( ) -> Self :: Request < ' a > ;
553559 }
554560
555- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
561+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
556562 #[ allow( private_bounds, private_interfaces) ]
557563 pub trait MultiResponseInner < ' a > {
558564 fn retrieve < I > ( & mut self ) -> Option < I :: Reified >
@@ -561,9 +567,9 @@ mod private {
561567 }
562568}
563569
564- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
570+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
565571impl IntoMultiRequest for EmptyMultiRequestBuilder { }
566- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
572+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
567573impl private:: IntoMultiRequestInner for EmptyMultiRequestBuilder {
568574 type Request < ' a > = EmptyMultiResponse ;
569575
@@ -572,15 +578,15 @@ impl private::IntoMultiRequestInner for EmptyMultiRequestBuilder {
572578 }
573579}
574580
575- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
581+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
576582impl < T , NEXT > IntoMultiRequest for ChainValMultiRequestBuilder < T , NEXT >
577583where
578584 T : ' static ,
579585 NEXT : IntoMultiRequest ,
580586{
581587}
582588
583- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
589+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
584590impl < T , NEXT > private:: IntoMultiRequestInner for ChainValMultiRequestBuilder < T , NEXT >
585591where
586592 T : ' static ,
@@ -595,15 +601,15 @@ where
595601 }
596602}
597603
598- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
604+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
599605impl < T , NEXT > IntoMultiRequest for ChainRefMultiRequestBuilder < T , NEXT >
600606where
601607 T : ?Sized + ' static ,
602608 NEXT : IntoMultiRequest ,
603609{
604610}
605611
606- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
612+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
607613impl < T , NEXT > private:: IntoMultiRequestInner for ChainRefMultiRequestBuilder < T , NEXT >
608614where
609615 T : ?Sized + ' static ,
@@ -668,7 +674,7 @@ where
668674
669675/// A response from a [MultiRequestBuilder]. The types returned from
670676/// [MultiRequestBuilder::request] implement this trait.
671- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
677+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
672678#[ allow( private_bounds) ]
673679pub trait MultiResponse < ' a > {
674680 /// Retrieve a reference with the type `R` from this multi response.
@@ -681,8 +687,8 @@ pub trait MultiResponse<'a> {
681687 /// [request_ref] - this is only an example.
682688 ///
683689 /// ```
684- /// #![feature(error_generic_member_access)]
685- /// use core::error::{Error, MultiRequestBuilder, MultiResponse};
690+ /// #![feature(error_generic_member_access, error_generic_member_multi_access )]
691+ /// use core::error::{Error, provide::{ MultiRequestBuilder, MultiResponse} };
686692 ///
687693 /// fn get_str(e: &dyn Error) -> Option<&str> {
688694 /// MultiRequestBuilder::new()
@@ -705,8 +711,8 @@ pub trait MultiResponse<'a> {
705711 /// [request_value] - this is only an example.
706712 ///
707713 /// ```
708- /// #![feature(error_generic_member_access)]
709- /// use core::error::{Error, MultiRequestBuilder, MultiResponse};
714+ /// #![feature(error_generic_member_access, error_generic_member_multi_access )]
715+ /// use core::error::{Error, provide::{ MultiRequestBuilder, MultiResponse} };
710716 ///
711717 /// fn get_string(e: &dyn Error) -> Option<String> {
712718 /// MultiRequestBuilder::new()
@@ -720,7 +726,7 @@ pub trait MultiResponse<'a> {
720726 V : ' static ;
721727}
722728
723- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
729+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
724730impl < ' a , T : private:: MultiResponseInner < ' a > > MultiResponse < ' a > for T {
725731 fn retrieve_ref < R > ( & mut self ) -> Option < & ' a R >
726732 where
@@ -736,7 +742,7 @@ impl<'a, T: private::MultiResponseInner<'a>> MultiResponse<'a> for T {
736742 self . retrieve :: < tags:: Value < V > > ( )
737743 }
738744}
739- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
745+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
740746#[ allow( private_bounds, private_interfaces) ]
741747impl < ' a > private:: MultiResponseInner < ' a > for EmptyMultiResponse {
742748 fn retrieve < I > ( & mut self ) -> Option < I :: Reified >
@@ -747,7 +753,7 @@ impl<'a> private::MultiResponseInner<'a> for EmptyMultiResponse {
747753 }
748754}
749755
750- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
756+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
751757impl < ' a , J , NEXT > private:: MultiResponseInner < ' a > for ChainMultiResponse < ' a , J , NEXT >
752758where
753759 J : tags:: Type < ' a > ,
@@ -772,7 +778,7 @@ where
772778 self . next . retrieve :: < I > ( )
773779 }
774780}
775- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
781+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
776782#[ allow( private_bounds, private_interfaces) ]
777783impl < ' a , T , NEXT > private:: MultiResponseInner < ' a > for ChainValMultiResponse < ' a , T , NEXT >
778784where
@@ -786,7 +792,7 @@ where
786792 self . inner . retrieve :: < I > ( )
787793 }
788794}
789- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
795+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
790796// SAFETY: delegates to inner impl
791797unsafe impl < ' a , T , NEXT > Erased < ' a > for ChainValMultiResponse < ' a , T , NEXT >
792798where
@@ -807,7 +813,7 @@ where
807813 }
808814}
809815
810- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
816+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
811817#[ allow( private_bounds, private_interfaces) ]
812818impl < ' a , T , NEXT > private:: MultiResponseInner < ' a > for ChainRefMultiResponse < ' a , T , NEXT >
813819where
@@ -821,7 +827,7 @@ where
821827 self . inner . retrieve :: < I > ( )
822828 }
823829}
824- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
830+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
825831// SAFETY: delegates to inner impl
826832unsafe impl < ' a , T , NEXT > Erased < ' a > for ChainRefMultiResponse < ' a , T , NEXT >
827833where
@@ -886,7 +892,7 @@ where
886892 }
887893}
888894
889- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
895+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
890896/// A [MultiRequestBuilder] is used to request multiple types from an [Error] at once.
891897///
892898/// Requesting a type from an [Error] is fairly fast - normally faster than formatting
@@ -896,9 +902,9 @@ where
896902/// # Examples
897903///
898904/// ```
899- /// #![feature(error_generic_member_access)]
905+ /// #![feature(error_generic_member_access, error_generic_member_multi_access )]
900906/// use core::fmt;
901- /// use core::error::{Error, MultiResponse, Request};
907+ /// use core::error::{Error, provide::{ MultiResponse, MultiRequestBuilder} , Request};
902908///
903909/// #[derive(Debug)]
904910/// struct MyError {
@@ -929,7 +935,7 @@ where
929935/// val_field: MyExitCode(3),
930936/// };
931937///
932- /// let mut request = core::error:: MultiRequestBuilder::new()
938+ /// let mut request = MultiRequestBuilder::new()
933939/// // request by reference
934940/// .with_ref::<str>()
935941/// // and by value
@@ -950,17 +956,17 @@ pub struct MultiRequestBuilder<INNER: IntoMultiRequest> {
950956 inner : PhantomData < INNER > ,
951957}
952958
953- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
959+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
954960impl < INNER : IntoMultiRequest > Debug for MultiRequestBuilder < INNER > {
955961 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> fmt:: Result {
956962 f. debug_tuple ( "MultiRequestBuilder" ) . field ( & crate :: any:: type_name :: < INNER > ( ) ) . finish ( )
957963 }
958964}
959965
960- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
966+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
961967impl < INNER : IntoMultiRequest > Copy for MultiRequestBuilder < INNER > { }
962968
963- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
969+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
964970impl < INNER : IntoMultiRequest > Clone for MultiRequestBuilder < INNER > {
965971 fn clone ( & self ) -> Self {
966972 * self
@@ -969,7 +975,7 @@ impl<INNER: IntoMultiRequest> Clone for MultiRequestBuilder<INNER> {
969975
970976impl MultiRequestBuilder < EmptyMultiRequestBuilder > {
971977 /// Create a new [MultiRequestBuilder]
972- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
978+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
973979 pub fn new ( ) -> Self {
974980 MultiRequestBuilder { inner : PhantomData }
975981 }
@@ -981,8 +987,8 @@ impl<INNER: IntoMultiRequest> MultiRequestBuilder<INNER> {
981987 /// # Examples
982988 ///
983989 /// ```
984- /// #![feature(error_generic_member_access)]
985- /// use core::error::{Error, MultiRequestBuilder, MultiResponse};
990+ /// #![feature(error_generic_member_access, error_generic_member_multi_access )]
991+ /// use core::error::{Error, provide::{ MultiRequestBuilder, MultiResponse} };
986992 ///
987993 /// fn get_string(e: &dyn Error) -> Option<String> {
988994 /// MultiRequestBuilder::new()
@@ -991,7 +997,7 @@ impl<INNER: IntoMultiRequest> MultiRequestBuilder<INNER> {
991997 /// .retrieve_value::<String>()
992998 /// }
993999 /// ```
994- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
1000+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
9951001 pub fn with_value < V : ' static > (
9961002 self ,
9971003 ) -> MultiRequestBuilder < ChainValMultiRequestBuilder < V , INNER > > {
@@ -1003,8 +1009,8 @@ impl<INNER: IntoMultiRequest> MultiRequestBuilder<INNER> {
10031009 /// # Examples
10041010 ///
10051011 /// ```
1006- /// #![feature(error_generic_member_access)]
1007- /// use core::error::{Error, MultiRequestBuilder, MultiResponse};
1012+ /// #![feature(error_generic_member_access, error_generic_member_multi_access )]
1013+ /// use core::error::{Error, provide::{ MultiRequestBuilder, MultiResponse} };
10081014 ///
10091015 /// fn get_str<'a>(e: &dyn Error) -> Option<&str> {
10101016 /// MultiRequestBuilder::new()
@@ -1013,15 +1019,15 @@ impl<INNER: IntoMultiRequest> MultiRequestBuilder<INNER> {
10131019 /// .retrieve_ref::<str>()
10141020 /// }
10151021 /// ```
1016- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
1022+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
10171023 pub fn with_ref < R : ' static + ?Sized > (
10181024 self ,
10191025 ) -> MultiRequestBuilder < ChainRefMultiRequestBuilder < R , INNER > > {
10201026 MultiRequestBuilder { inner : PhantomData }
10211027 }
10221028
10231029 /// Request provided values from a given error.
1024- #[ unstable( feature = "error_generic_member_access " , issue = "99301" ) ]
1030+ #[ unstable( feature = "error_generic_member_multi_access " , issue = "99301" ) ]
10251031 pub fn request < ' a > ( self , err : & ' a ( impl Error + ?Sized ) ) -> impl MultiResponse < ' a > {
10261032 let mut tagged = Tagged :: new_virtual ( INNER :: get_request ( ) ) ;
10271033 err. provide ( tagged. as_request ( ) ) ;
0 commit comments