Skip to content

Commit 3afed4d

Browse files
author
Ariel Ben-Yehuda
committed
tmep
1 parent 284ffe2 commit 3afed4d

File tree

3 files changed

+46
-25
lines changed

3 files changed

+46
-25
lines changed

library/core/src/error/provide.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ pub trait MultiResponse<'a> {
675675
/// consumes the reference, so the next call to `retrieve_ref`
676676
/// with the same type will not call `fulfil`.
677677
///
678-
/// This function returns `self`` to allow easy chained use.
678+
/// This function returns `self` to allow easy chained use.
679679
///
680680
/// # Examples
681681
///
@@ -684,13 +684,13 @@ pub trait MultiResponse<'a> {
684684
///
685685
/// ```
686686
/// #![feature(error_generic_member_access)]
687-
/// use core::error::MultiRequestBuilder;
687+
/// use core::error::{Error, MultiRequestBuilder, MultiResponse};
688688
///
689689
/// fn get_str(e: &dyn Error) -> Option<&str> {
690690
/// let mut result = None;
691691
/// MultiRequestBuilder::new()
692692
/// .with_ref::<str>()
693-
/// .request(&e)
693+
/// .request(e)
694694
/// .retrieve_ref(|res| result = Some(res));
695695
/// result
696696
/// }
@@ -714,13 +714,13 @@ pub trait MultiResponse<'a> {
714714
///
715715
/// ```
716716
/// #![feature(error_generic_member_access)]
717-
/// use core::error::MultiRequestBuilder;
717+
/// use core::error::{Error, MultiRequestBuilder, MultiResponse};
718718
///
719719
/// fn get_string(e: &dyn Error) -> Option<String> {
720720
/// let mut result = None;
721721
/// MultiRequestBuilder::new()
722722
/// .with_value::<String>()
723-
/// .request(&e)
723+
/// .request(e)
724724
/// .retrieve_value(|res| result = Some(res));
725725
/// result
726726
/// }
@@ -913,14 +913,15 @@ where
913913
/// ```
914914
/// #![feature(error_generic_member_access)]
915915
/// use core::fmt;
916-
/// use core::error::{Error, ValueHaver, Request};
916+
/// use core::error::{Error, MultiResponse, Request};
917917
///
918918
/// #[derive(Debug)]
919919
/// struct MyError {
920920
/// str_field: &'static str,
921921
/// val_field: MyExitCode,
922922
/// }
923923
///
924+
/// #[derive(Copy, Clone, Debug, PartialEq, Eq)]
924925
/// struct MyExitCode(u32);
925926
///
926927
/// impl fmt::Display for MyError {
@@ -930,11 +931,10 @@ where
930931
/// }
931932
///
932933
/// impl Error for MyError {
933-
/// #[no_mangle]
934934
/// fn provide<'a>(&'a self, request: &mut Request<'a>) {
935935
/// request
936936
/// .provide_ref::<str>(self.str_field)
937-
/// .provide_value::<u32>(self.val_field);
937+
/// .provide_value::<MyExitCode>(self.val_field);
938938
/// }
939939
/// }
940940
///
@@ -951,13 +951,13 @@ where
951951
/// // request by reference
952952
/// .with_ref::<str>()
953953
/// // and by value
954-
/// .with_value::<u32>()
954+
/// .with_value::<MyExitCode>()
955955
/// // and some type that isn't in the error
956956
/// .with_value::<String>()
957957
/// .request(&e)
958958
/// // The error has str by reference
959959
/// .retrieve_ref::<str>(|val| str_val = Some(val))
960-
/// // The error has u32 by value
960+
/// // The error has MyExitCode by value
961961
/// .retrieve_value::<MyExitCode>(|val| exit_code_val = Some(val))
962962
/// // The error does not have a string field, consume will not be called
963963
/// .retrieve_value::<String>(|val| string_val = Some(val));
@@ -986,13 +986,13 @@ impl<INNER: for<'a> IntoMultiRequest<'a>> MultiRequestBuilder<INNER> {
986986
///
987987
/// ```
988988
/// #![feature(error_generic_member_access)]
989-
/// use core::error::MultiRequestBuilder;
989+
/// use core::error::{Error, MultiRequestBuilder, MultiResponse};
990990
///
991991
/// fn get_string(e: &dyn Error) -> Option<String> {
992992
/// let mut result = None;
993993
/// MultiRequestBuilder::new()
994994
/// .with_value::<String>()
995-
/// .request(&e)
995+
/// .request(e)
996996
/// .retrieve_value(|res| result = Some(res));
997997
/// result
998998
/// }
@@ -1010,13 +1010,13 @@ impl<INNER: for<'a> IntoMultiRequest<'a>> MultiRequestBuilder<INNER> {
10101010
///
10111011
/// ```
10121012
/// #![feature(error_generic_member_access)]
1013-
/// use core::error::MultiRequestBuilder;
1013+
/// use core::error::{Error, MultiRequestBuilder, MultiResponse};
10141014
///
10151015
/// fn get_string(e: &dyn Error) -> Option<String> {
10161016
/// let mut result = None;
10171017
/// MultiRequestBuilder::new()
10181018
/// .with_value::<String>()
1019-
/// .request(&e)
1019+
/// .request(e)
10201020
/// .retrieve_value(|res| result = Some(res));
10211021
/// result
10221022
/// }

library/coretests/tests/error.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,30 @@ fn test_error_combined_access_concrete() {
105105
assert_eq!(u8_val, None);
106106
assert_eq!(valid_ref.unwrap(), Valid);
107107
}
108+
109+
#[test]
110+
fn test_error_combined_access_dyn() {
111+
let obj = SomeConcreteType { some_string: "hello".to_owned() };
112+
let obj: &dyn Error = &obj;
113+
114+
let mut string_val = None;
115+
let mut string_ref = None;
116+
let mut u8_val = None;
117+
let mut valid_ref = None;
118+
119+
MultiRequestBuilder::new()
120+
.with_value::<String>()
121+
.with_ref::<String>()
122+
.with_value::<u8>()
123+
.with_ref::<Valid>()
124+
.request(&obj)
125+
.retrieve_value::<String>(|val| string_val = Some(val))
126+
.retrieve_ref::<String>(|val| string_ref = Some(val))
127+
.retrieve_value::<u8>(|val| u8_val = Some(val))
128+
.retrieve_ref::<Valid>(|val| valid_ref = Some(val));
129+
130+
assert_eq!(string_ref.unwrap(), "hello");
131+
assert_eq!(string_val.unwrap(), "bye");
132+
assert_eq!(u8_val, None);
133+
assert_eq!(valid_ref.unwrap(), Valid);
134+
}

tests/codegen-llvm/error-provide.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ impl std::error::Error for MyError {
5959
pub fn provide_multi(
6060
e: &dyn std::error::Error,
6161
) -> (Option<&[u8; 0]>, Option<&[u8; 1]>, Option<&[u8; 2]>) {
62+
let (mut bt1, mut bt2, mut bt3) = (None, None, None);
6263
let mut value = core::error::MultiRequestBuilder::new()
6364
.with_ref::<[u8; 0]>()
6465
.with_ref::<[u8; 1]>()
@@ -68,17 +69,10 @@ pub fn provide_multi(
6869
.with_ref::<[u8; 5]>()
6970
.with_ref::<[u8; 6]>()
7071
.with_ref::<[u8; 7]>()
71-
.request(e);
72-
let (mut bt1, mut bt2, mut bt3) = (None, None, None);
73-
value.consume_ref(|b| {
74-
bt1 = Some(b);
75-
});
76-
value.consume_ref(|b| {
77-
bt2 = Some(b);
78-
});
79-
value.consume_ref(|b| {
80-
bt3 = Some(b);
81-
});
72+
.request(e)
73+
.retrieve_ref(|b| bt1 = Some(b))
74+
.retrieve_ref(|b| bt2 = Some(b))
75+
.retrieve_ref(|b| bt3 = Some(b));
8276
(bt1, bt2, bt3)
8377
}
8478

0 commit comments

Comments
 (0)