Skip to content

Commit 17ab7ff

Browse files
serde support for error metadata
1 parent 3aa4cc2 commit 17ab7ff

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

rust-runtime/aws-smithy-types/src/error/metadata.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ pub const EMPTY_ERROR_METADATA: ErrorMetadata = ErrorMetadata {
3939
/// For many services, Errors are modeled. However, many services only partially model errors or don't
4040
/// model errors at all. In these cases, the SDK will return this generic error type to expose the
4141
/// `code`, `message` and `request_id`.
42+
#[cfg_attr(
43+
all(aws_sdk_unstable, feature = "serde-serialize"),
44+
derive(serde::Serialize)
45+
)]
46+
#[cfg_attr(
47+
all(aws_sdk_unstable, feature = "serde-deserialize"),
48+
derive(serde::Deserialize)
49+
)]
4250
#[derive(Debug, Eq, PartialEq, Default, Clone)]
4351
pub struct ErrorMetadata {
4452
code: Option<String>,
@@ -47,8 +55,23 @@ pub struct ErrorMetadata {
4755
}
4856

4957
/// Builder for [`ErrorMetadata`].
58+
#[cfg_attr(
59+
all(aws_sdk_unstable, feature = "serde-serialize"),
60+
derive(serde::Serialize)
61+
)]
62+
#[cfg_attr(
63+
all(aws_sdk_unstable, feature = "serde-deserialize"),
64+
derive(serde::Deserialize)
65+
)]
5066
#[derive(Debug, Default)]
5167
pub struct Builder {
68+
#[cfg_attr(
69+
any(
70+
all(aws_sdk_unstable, feature = "serde-deserialize"),
71+
all(aws_sdk_unstable, feature = "serde-serialize")
72+
),
73+
serde(flatten)
74+
)]
5275
inner: ErrorMetadata,
5376
}
5477

@@ -164,3 +187,36 @@ impl fmt::Display for ErrorMetadata {
164187
}
165188

166189
impl std::error::Error for ErrorMetadata {}
190+
191+
#[cfg(all(
192+
test,
193+
any(
194+
all(aws_sdk_unstable, feature = "serde-deserialize"),
195+
all(aws_sdk_unstable, feature = "serde-serialize")
196+
)
197+
))]
198+
mod test {
199+
use super::*;
200+
201+
#[test]
202+
/// tests de/ser on ErrorMetaData.
203+
fn test_error_meta_data() {
204+
let mut data = Builder::default()
205+
.code("code")
206+
.message("message")
207+
.custom("hello", "world");
208+
let ok = serde_json::to_string_pretty(&EMPTY_ERROR_METADATA).unwrap();
209+
assert_eq!(
210+
&ok,
211+
include_str!("../../test-data/error_meta_data_empty.json")
212+
);
213+
assert_eq!(
214+
serde_json::from_str(include_str!("../../test-data/error_meta_data.json")).unwrap(),
215+
&data
216+
);
217+
assert_eq!(
218+
serde_json::from_str(include_str!("../../test-data/error_meta_data.json")).unwrap(),
219+
data.build()
220+
);
221+
}
222+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"code": "code",
3+
"message": "message",
4+
"extras": {
5+
"hello": "world"
6+
}
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"code": null,
3+
"message": null,
4+
"extras": null
5+
}

0 commit comments

Comments
 (0)