lambda_apigateway_response/
response.rs

1use 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}