aws_smithy_schema/schema/
error_envelope.rs1use aws_smithy_runtime_api::http::Headers;
16
17pub fn sanitize_error_code(error_code: &str) -> &str {
26 let error_code = match error_code.find(':') {
28 Some(idx) => &error_code[..idx],
29 None => error_code,
30 };
31 match error_code.find('#') {
33 Some(idx) => &error_code[idx + 1..],
34 None => error_code,
35 }
36}
37
38pub fn parse_query_compatible_header(headers: &Headers) -> Option<(&str, &str)> {
43 let value = headers.get("x-amzn-query-error")?;
44 value
45 .find(';')
46 .map(|idx| (&value[..idx], &value[idx + 1..]))
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52 use aws_smithy_runtime_api::http::Headers;
53
54 #[test]
55 fn sanitize_strips_namespace_and_url() {
56 assert_eq!(sanitize_error_code("FooError"), "FooError");
57 assert_eq!(sanitize_error_code("com.example#FooError"), "FooError");
58 assert_eq!(
59 sanitize_error_code("FooError:http://internal.example.com/x"),
60 "FooError"
61 );
62 assert_eq!(
63 sanitize_error_code("com.example#FooError:http://internal/x"),
64 "FooError"
65 );
66 }
67
68 #[test]
69 fn query_compatible_header_splits_on_semicolon() {
70 let mut headers = Headers::new();
71 headers.insert("x-amzn-query-error", "AWS.SimpleQueueService.Foo;Sender");
72 assert_eq!(
73 parse_query_compatible_header(&headers),
74 Some(("AWS.SimpleQueueService.Foo", "Sender"))
75 );
76 }
77
78 #[test]
79 fn query_compatible_header_absent_or_malformed_is_none() {
80 let empty = Headers::new();
81 assert_eq!(parse_query_compatible_header(&empty), None);
82
83 let mut no_separator = Headers::new();
84 no_separator.insert("x-amzn-query-error", "NoSemicolon");
85 assert_eq!(parse_query_compatible_header(&no_separator), None);
86 }
87}