lambda_apigateway_response/
response.rs1use serde::{
2 ser,
3 Serialize,
4 Serializer,
5};
6
7use crate::{
8 http::StatusCode,
9 types::{
10 Headers,
11 MultiValueHeaders,
12 },
13};
14
15#[derive(Debug, Serialize)]
16#[serde(rename_all = "camelCase")]
17pub struct Response<T: Serialize> {
18 #[serde(serialize_with = "serialize_status_code")]
19 pub status_code: StatusCode,
20
21 #[serde(serialize_with = "serialize_body")]
22 pub body: T,
23
24 #[serde(skip_serializing_if = "Headers::is_empty")]
25 pub headers: Headers,
26
27 #[serde(skip_serializing_if = "MultiValueHeaders::is_empty")]
28 pub multi_value_headers: MultiValueHeaders,
29
30 pub is_base64_encoded: bool,
31}
32
33fn serialize_status_code<S: Serializer>(
34 status_code: &StatusCode,
35 serializer: S,
36) -> Result<S::Ok, S::Error> {
37 serializer.serialize_u16(status_code.as_u16())
38}
39
40fn serialize_body<B, S>(
41 body: &B,
42 serializer: S,
43) -> Result<S::Ok, S::Error>
44where
45 B: Serialize,
46 S: Serializer,
47{
48 match serde_json::to_string(body) {
49 Ok(s) => serializer.serialize_str(&s),
50 Err(e) => Err(<S::Error as ser::Error>::custom(e)),
51 }
52}