Skip to content

Commit 39d2e67

Browse files
author
Ariel Ben-Yehuda
committed
move provide to its own module
1 parent 57bc12f commit 39d2e67

File tree

6 files changed

+72
-53
lines changed

6 files changed

+72
-53
lines changed

library/core/src/error/mod.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,11 @@
44
use crate::any::TypeId;
55
use crate::fmt::{Debug, Display};
66

7-
mod provide;
7+
#[unstable(feature = "error_generic_member_multi_access", issue = "99301")]
8+
pub mod provide;
89

910
#[unstable(feature = "error_generic_member_access", issue = "99301")]
10-
pub use provide::{
11-
ChainRefMultiRequestBuilder, ChainRefMultiResponse, ChainValMultiRequestBuilder,
12-
ChainValMultiResponse, EmptyMultiRequestBuilder, IntoMultiRequest, MultiRequestBuilder,
13-
MultiResponse, Request, request_ref, request_value,
14-
};
11+
pub use provide::{Request, request_ref, request_value};
1512

1613
/// `Error` is a trait representing the basic expectations for error values,
1714
/// i.e., values of type `E` in [`Result<T, E>`].

library/core/src/error/provide.rs

Lines changed: 49 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! Implementation of [Request]
1+
//! A mechanism to allow providing values of arbitrary types for errors
22
33
use crate::any::TypeId;
44
use 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.
@@ -31,6 +34,9 @@ where
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")]
510516
impl<'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)]
519525
pub 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)]
526532
pub 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)]
541547
pub trait IntoMultiRequest: private::IntoMultiRequestInner + 'static {}
542548

543549
mod 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")]
565571
impl IntoMultiRequest for EmptyMultiRequestBuilder {}
566-
#[unstable(feature = "error_generic_member_access", issue = "99301")]
572+
#[unstable(feature = "error_generic_member_multi_access", issue = "99301")]
567573
impl 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")]
576582
impl<T, NEXT> IntoMultiRequest for ChainValMultiRequestBuilder<T, NEXT>
577583
where
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")]
584590
impl<T, NEXT> private::IntoMultiRequestInner for ChainValMultiRequestBuilder<T, NEXT>
585591
where
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")]
599605
impl<T, NEXT> IntoMultiRequest for ChainRefMultiRequestBuilder<T, NEXT>
600606
where
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")]
607613
impl<T, NEXT> private::IntoMultiRequestInner for ChainRefMultiRequestBuilder<T, NEXT>
608614
where
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)]
673679
pub 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")]
724730
impl<'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)]
741747
impl<'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")]
751757
impl<'a, J, NEXT> private::MultiResponseInner<'a> for ChainMultiResponse<'a, J, NEXT>
752758
where
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)]
777783
impl<'a, T, NEXT> private::MultiResponseInner<'a> for ChainValMultiResponse<'a, T, NEXT>
778784
where
@@ -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
791797
unsafe impl<'a, T, NEXT> Erased<'a> for ChainValMultiResponse<'a, T, NEXT>
792798
where
@@ -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)]
812818
impl<'a, T, NEXT> private::MultiResponseInner<'a> for ChainRefMultiResponse<'a, T, NEXT>
813819
where
@@ -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
826832
unsafe impl<'a, T, NEXT> Erased<'a> for ChainRefMultiResponse<'a, T, NEXT>
827833
where
@@ -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")]
954960
impl<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")]
961967
impl<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")]
964970
impl<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

970976
impl 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());

library/coretests/tests/error.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use core::error::{Error, MultiRequestBuilder, MultiResponse, Request, request_ref, request_value};
1+
use core::error::provide::{MultiRequestBuilder, MultiResponse, Request};
2+
use core::error::{Error, request_ref, request_value};
23

34
// Test the `Request` API.
45
#[derive(Debug)]

library/coretests/tests/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#![feature(duration_constants)]
4646
#![feature(duration_constructors)]
4747
#![feature(error_generic_member_access)]
48+
#![feature(error_generic_member_multi_access)]
4849
#![feature(exact_div)]
4950
#![feature(exact_size_is_empty)]
5051
#![feature(extend_one)]

src/tools/rust-analyzer/crates/ide-db/src/generated/lints.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5871,6 +5871,20 @@ The tracking issue for this feature is: [#99301]
58715871

58725872
[#99301]: https://github.com/rust-lang/rust/issues/99301
58735873

5874+
------------------------
5875+
"##,
5876+
default_severity: Severity::Allow,
5877+
warn_since: None,
5878+
deny_since: None,
5879+
},
5880+
Lint {
5881+
label: "error_generic_member_multi_access",
5882+
description: r##"# `error_generic_member_multi_access`
5883+
5884+
The tracking issue for this feature is: [#99301]
5885+
5886+
[#99301]: https://github.com/rust-lang/rust/issues/99301
5887+
58745888
------------------------
58755889
"##,
58765890
default_severity: Severity::Allow,

0 commit comments

Comments
 (0)