diff --git a/lambda-events/src/custom_serde/mod.rs b/lambda-events/src/custom_serde/mod.rs index a996e91f..d7b340f2 100644 --- a/lambda-events/src/custom_serde/mod.rs +++ b/lambda-events/src/custom_serde/mod.rs @@ -3,7 +3,6 @@ use serde::{ de::{Deserialize, Deserializer, Error as DeError}, ser::Serializer, }; -use std::collections::HashMap; #[cfg(feature = "codebuild")] pub(crate) mod codebuild_time; @@ -58,47 +57,18 @@ where serializer.serialize_str(&base64::engine::general_purpose::STANDARD.encode(value)) } -/// Deserializes `HashMap<_>`, mapping JSON `null` to an empty map. -pub(crate) fn deserialize_lambda_map<'de, D, K, V>(deserializer: D) -> Result, D::Error> +/// Deserializes any `Default` type, mapping JSON `null` to `T::default()`. +/// +/// **Note** null-to-empty semantics are usually clear for container types (Map, Vec, etc). +/// For most other data types, prefer modeling fields as ```Option``` with #[serde(default)] +/// instead of using this deserializer. Option preserves information about the message +/// for the application, and default semantics for the target data type may change +/// over time without warning. +pub(crate) fn deserialize_nullish<'de, D, T>(deserializer: D) -> Result where D: Deserializer<'de>, - K: serde::Deserialize<'de>, - K: std::hash::Hash, - K: std::cmp::Eq, - V: serde::Deserialize<'de>, + T: Default + Deserialize<'de>, { - // https://github.com/serde-rs/serde/issues/1098 - let opt = Option::deserialize(deserializer)?; - Ok(opt.unwrap_or_default()) -} - -#[cfg(feature = "dynamodb")] -/// Deserializes `Item`, mapping JSON `null` to an empty item. -pub(crate) fn deserialize_lambda_dynamodb_item<'de, D>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - // https://github.com/serde-rs/serde/issues/1098 - let opt = Option::deserialize(deserializer)?; - Ok(opt.unwrap_or_default()) -} - -/// Deserializes `HashMap<_>`, mapping JSON `null` to an empty map. -#[cfg(any( - feature = "alb", - feature = "apigw", - feature = "cloudwatch_events", - feature = "code_commit", - feature = "cognito", - feature = "sns", - feature = "vpc_lattice", - test -))] -pub(crate) fn deserialize_nullish_boolean<'de, D>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - // https://github.com/serde-rs/serde/issues/1098 let opt = Option::deserialize(deserializer)?; Ok(opt.unwrap_or_default()) } @@ -107,7 +77,9 @@ where #[allow(deprecated)] mod test { use super::*; + use serde::{Deserialize, Serialize}; + use std::collections::HashMap; #[test] fn test_deserialize_base64() { @@ -141,7 +113,7 @@ mod test { fn test_deserialize_map() { #[derive(Deserialize)] struct Test { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] v: HashMap, } let input = serde_json::json!({ @@ -160,9 +132,9 @@ mod test { #[cfg(feature = "dynamodb")] #[test] fn test_deserialize_lambda_dynamodb_item() { - #[derive(Deserialize)] + #[derive(Deserialize, Debug)] struct Test { - #[serde(deserialize_with = "deserialize_lambda_dynamodb_item")] + #[serde(deserialize_with = "deserialize_nullish")] v: serde_dynamo::Item, } let input = serde_json::json!({ @@ -176,13 +148,39 @@ mod test { }); let decoded: Test = serde_json::from_value(input).unwrap(); assert_eq!(serde_dynamo::Item::from(HashMap::new()), decoded.v); + + let input = serde_json::json!({}); + let failure = serde_json::from_value::(input); + assert!(failure.is_err(), "Missing field should not default: {failure:?}") + } + + #[test] + fn test_deserialize_nullish() { + #[derive(Debug, Default, Deserialize, PartialEq)] + struct Inner { + x: u32, + } + #[derive(Deserialize)] + struct Test { + #[serde(default, deserialize_with = "deserialize_nullish")] + v: Inner, + } + + let decoded: Test = serde_json::from_str(r#"{"v": null}"#).unwrap(); + assert_eq!(decoded.v, Inner::default()); + + let decoded: Test = serde_json::from_str(r#"{}"#).unwrap(); + assert_eq!(decoded.v, Inner::default()); + + let decoded: Test = serde_json::from_str(r#"{"v": {"x": 42}}"#).unwrap(); + assert_eq!(decoded.v, Inner { x: 42 }); } #[test] fn test_deserialize_nullish_boolean() { #[derive(Deserialize)] struct Test { - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] v: bool, } diff --git a/lambda-events/src/event/activemq/mod.rs b/lambda-events/src/event/activemq/mod.rs index ee0ebe37..c90eb1d7 100644 --- a/lambda-events/src/event/activemq/mod.rs +++ b/lambda-events/src/event/activemq/mod.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::deserialize_lambda_map; +use crate::custom_serde::deserialize_nullish; #[non_exhaustive] #[cfg_attr(feature = "builders", derive(Builder))] @@ -54,7 +54,7 @@ pub struct ActiveMqMessage { pub data: Option, pub broker_in_time: i64, pub broker_out_time: i64, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub properties: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. diff --git a/lambda-events/src/event/alb/mod.rs b/lambda-events/src/event/alb/mod.rs index 460aa7bd..429f4deb 100644 --- a/lambda-events/src/event/alb/mod.rs +++ b/lambda-events/src/event/alb/mod.rs @@ -1,7 +1,7 @@ use crate::{ custom_serde::{ - deserialize_headers, deserialize_nullish_boolean, http_method, serialize_headers, - serialize_multi_value_headers, serialize_query_string_parameters, + deserialize_headers, deserialize_nullish, http_method, serialize_headers, serialize_multi_value_headers, + serialize_query_string_parameters, }, encodings::Body, }; @@ -35,7 +35,7 @@ pub struct AlbTargetGroupRequest { #[serde(serialize_with = "serialize_multi_value_headers")] pub multi_value_headers: HeaderMap, pub request_context: AlbTargetGroupRequestContext, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub is_base64_encoded: bool, pub body: Option, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -101,7 +101,7 @@ pub struct AlbTargetGroupResponse { pub multi_value_headers: HeaderMap, #[serde(skip_serializing_if = "Option::is_none")] pub body: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub is_base64_encoded: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. diff --git a/lambda-events/src/event/apigw/mod.rs b/lambda-events/src/event/apigw/mod.rs index c4453a38..6e71df7d 100644 --- a/lambda-events/src/event/apigw/mod.rs +++ b/lambda-events/src/event/apigw/mod.rs @@ -1,7 +1,6 @@ use crate::{ custom_serde::{ - deserialize_headers, deserialize_lambda_map, deserialize_nullish_boolean, http_method, serialize_headers, - serialize_multi_value_headers, + deserialize_headers, deserialize_nullish, http_method, serialize_headers, serialize_multi_value_headers, }, encodings::Body, iam::IamPolicyStatement, @@ -39,17 +38,17 @@ pub struct ApiGatewayProxyRequest { pub query_string_parameters: QueryMap, #[serde(default, deserialize_with = "query_map::serde::standard::deserialize_empty")] pub multi_value_query_string_parameters: QueryMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub path_parameters: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub stage_variables: HashMap, #[serde(bound = "")] pub request_context: ApiGatewayProxyRequestContext, #[serde(default)] pub body: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub is_base64_encoded: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. @@ -76,7 +75,7 @@ pub struct ApiGatewayProxyResponse { pub multi_value_headers: HeaderMap, #[serde(skip_serializing_if = "Option::is_none")] pub body: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub is_base64_encoded: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. @@ -238,12 +237,12 @@ pub struct ApiGatewayV2httpRequest { #[serde(skip_serializing_if = "QueryMap::is_empty")] #[serde(serialize_with = "query_map::serde::aws_api_gateway_v2::serialize_query_string_parameters")] pub query_string_parameters: QueryMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(skip_serializing_if = "HashMap::is_empty")] pub path_parameters: HashMap, pub request_context: ApiGatewayV2httpRequestContext, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub stage_variables: HashMap, #[serde(skip_serializing_if = "Option::is_none")] @@ -314,7 +313,7 @@ pub struct ApiGatewayRequestAuthorizer { rename = "lambda", default, skip_serializing_if = "HashMap::is_empty", - deserialize_with = "deserialize_lambda_map" + deserialize_with = "deserialize_nullish" )] pub fields: HashMap, #[serde(skip_serializing_if = "Option::is_none")] @@ -335,7 +334,7 @@ pub struct ApiGatewayRequestAuthorizer { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct ApiGatewayRequestAuthorizerJwtDescription { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub claims: HashMap, #[serde(skip_serializing_if = "Option::is_none")] @@ -442,7 +441,7 @@ pub struct ApiGatewayV2httpResponse { pub multi_value_headers: HeaderMap, #[serde(skip_serializing_if = "Option::is_none")] pub body: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub is_base64_encoded: bool, pub cookies: Vec, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -525,17 +524,17 @@ pub struct ApiGatewayWebsocketProxyRequest { pub query_string_parameters: QueryMap, #[serde(default, deserialize_with = "query_map::serde::standard::deserialize_empty")] pub multi_value_query_string_parameters: QueryMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub path_parameters: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub stage_variables: HashMap, #[serde(bound = "")] pub request_context: ApiGatewayWebsocketProxyRequestContext, #[serde(default)] pub body: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub is_base64_encoded: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. @@ -815,13 +814,13 @@ pub struct ApiGatewayV2CustomAuthorizerV1Request { #[serde(deserialize_with = "http_serde::header_map::deserialize", default)] #[serde(serialize_with = "serialize_headers")] pub headers: HeaderMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub query_string_parameters: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub path_parameters: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub stage_variables: HashMap, pub request_context: ApiGatewayV2CustomAuthorizerV1RequestTypeRequestContext, @@ -860,14 +859,14 @@ pub struct ApiGatewayV2CustomAuthorizerV2Request { #[serde(deserialize_with = "http_serde::header_map::deserialize", default)] #[serde(serialize_with = "serialize_headers")] pub headers: HeaderMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub query_string_parameters: HashMap, pub request_context: ApiGatewayV2httpRequestContext, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub path_parameters: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub stage_variables: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -890,7 +889,7 @@ pub struct ApiGatewayCustomAuthorizerContext { pub principal_id: Option, pub string_key: Option, pub num_key: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub bool_key: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. @@ -993,10 +992,10 @@ pub struct ApiGatewayCustomAuthorizerRequestTypeRequest { pub query_string_parameters: QueryMap, #[serde(default, deserialize_with = "query_map::serde::standard::deserialize_empty")] pub multi_value_query_string_parameters: QueryMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub path_parameters: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub stage_variables: HashMap, pub request_context: ApiGatewayCustomAuthorizerRequestTypeRequestContext, diff --git a/lambda-events/src/event/appsync/mod.rs b/lambda-events/src/event/appsync/mod.rs index e00cd3c3..16332f5d 100644 --- a/lambda-events/src/event/appsync/mod.rs +++ b/lambda-events/src/event/appsync/mod.rs @@ -4,7 +4,7 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::deserialize_lambda_map; +use crate::custom_serde::deserialize_nullish; /// Deprecated: `AppSyncResolverTemplate` does not represent resolver events sent by AppSync. Instead directly model your input schema, or use `map[string]string`, `json.RawMessage`,` interface{}`, etc.. #[non_exhaustive] @@ -79,7 +79,7 @@ where pub issuer: Option, #[serde(default)] pub username: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(bound = "")] pub claims: HashMap, @@ -139,7 +139,7 @@ where pub query_string: Option, #[serde(default)] pub operation_name: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(bound = "")] pub variables: HashMap, @@ -164,7 +164,7 @@ where T1: Serialize, { pub is_authorized: bool, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(bound = "")] pub resolver_context: HashMap, @@ -229,7 +229,7 @@ where #[derive(Debug, Default, Clone, Eq, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct AppSyncRequest { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(bound = "")] pub headers: HashMap>, diff --git a/lambda-events/src/event/autoscaling/mod.rs b/lambda-events/src/event/autoscaling/mod.rs index 9cd2d8c7..d14bc1b0 100644 --- a/lambda-events/src/event/autoscaling/mod.rs +++ b/lambda-events/src/event/autoscaling/mod.rs @@ -5,7 +5,7 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::deserialize_lambda_map; +use crate::custom_serde::deserialize_nullish; /// `AutoScalingEvent` struct is used to parse the json for auto scaling event types // #[non_exhaustive] @@ -41,7 +41,7 @@ where pub region: Option, /// Information about resources impacted by event pub resources: Vec, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(bound = "")] pub detail: HashMap, diff --git a/lambda-events/src/event/cloudwatch_events/gamelift.rs b/lambda-events/src/event/cloudwatch_events/gamelift.rs index 875ff2ec..9ff2e431 100644 --- a/lambda-events/src/event/cloudwatch_events/gamelift.rs +++ b/lambda-events/src/event/cloudwatch_events/gamelift.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "catch-all-fields")] use serde_json::Value; -use crate::custom_serde::deserialize_nullish_boolean; +use crate::custom_serde::deserialize_nullish; #[non_exhaustive] #[cfg_attr(feature = "builders", derive(Builder))] @@ -50,7 +50,7 @@ pub struct Ticket { pub struct Player { pub player_id: String, pub team: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub accepted: bool, pub player_session_id: Option, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. diff --git a/lambda-events/src/event/code_commit/mod.rs b/lambda-events/src/event/code_commit/mod.rs index d3311261..dc6574a3 100644 --- a/lambda-events/src/event/code_commit/mod.rs +++ b/lambda-events/src/event/code_commit/mod.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "catch-all-fields")] use serde_json::Value; -use crate::custom_serde::deserialize_nullish_boolean; +use crate::custom_serde::deserialize_nullish; /// `CodeCommitEvent` represents a CodeCommit event #[non_exhaustive] @@ -100,7 +100,7 @@ pub struct CodeCommitReference { pub commit: Option, #[serde(default)] pub ref_: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub created: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. diff --git a/lambda-events/src/event/cognito/mod.rs b/lambda-events/src/event/cognito/mod.rs index 034d76ba..88e415d4 100644 --- a/lambda-events/src/event/cognito/mod.rs +++ b/lambda-events/src/event/cognito/mod.rs @@ -4,7 +4,7 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::{deserialize_lambda_map, deserialize_nullish_boolean}; +use crate::custom_serde::deserialize_nullish; /// `CognitoEvent` contains data from an event sent from AWS Cognito Sync #[non_exhaustive] @@ -14,7 +14,7 @@ use crate::custom_serde::{deserialize_lambda_map, deserialize_nullish_boolean}; pub struct CognitoEvent { #[serde(default)] pub dataset_name: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub dataset_records: HashMap, #[serde(default)] @@ -313,13 +313,13 @@ pub struct CognitoEventUserPoolsHeader { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsPreSignupRequest { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub validation_data: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -357,10 +357,10 @@ pub struct CognitoEventUserPoolsPreSignupResponse { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsPreAuthenticationRequest { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub validation_data: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -393,10 +393,10 @@ pub struct CognitoEventUserPoolsPreAuthenticationResponse { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsPostConfirmationRequest { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -430,11 +430,14 @@ pub struct CognitoEventUserPoolsPostConfirmationResponse { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsPreTokenGenRequest { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, + /// Group and role overrides. Note that null or missing values in the request + /// deserialize to [`GroupConfiguration::default`]. + #[serde(default, deserialize_with = "deserialize_nullish")] pub group_configuration: GroupConfiguration, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -492,11 +495,14 @@ pub struct CognitoEventUserPoolsPreTokenGenV2 { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsPreTokenGenRequestV2 { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, + /// Group and role overrides. Note that null or missing values in the request + /// deserialize to [`GroupConfiguration::default`]. + #[serde(default, deserialize_with = "deserialize_nullish")] pub group_configuration: GroupConfiguration, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, pub scopes: Vec, @@ -590,10 +596,10 @@ pub struct CognitoAccessTokenGenerationV2 { #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsPostAuthenticationRequest { pub new_device_used: bool, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -628,10 +634,10 @@ pub struct CognitoEventUserPoolsPostAuthenticationResponse { pub struct CognitoEventUserPoolsMigrateUserRequest { #[serde(default)] pub password: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub validation_data: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -650,7 +656,7 @@ pub struct CognitoEventUserPoolsMigrateUserRequest { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsMigrateUserResponse { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, #[serde(default)] @@ -659,7 +665,7 @@ pub struct CognitoEventUserPoolsMigrateUserResponse { pub message_action: Option, #[serde(default)] pub desired_delivery_mediums: Option>, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub force_alias_creation: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. @@ -678,7 +684,7 @@ pub struct CognitoEventUserPoolsMigrateUserResponse { #[serde(rename_all = "camelCase")] pub struct ClaimsOverrideDetails { pub group_override_details: GroupConfiguration, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub claims_to_add_or_override: HashMap, pub claims_to_suppress: Vec, @@ -739,11 +745,11 @@ pub struct CognitoEventUserPoolsChallengeResult { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsDefineAuthChallengeRequest { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, pub session: Vec>, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, #[serde(default)] @@ -766,9 +772,9 @@ pub struct CognitoEventUserPoolsDefineAuthChallengeRequest { pub struct CognitoEventUserPoolsDefineAuthChallengeResponse { #[serde(default)] pub challenge_name: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub issue_tokens: bool, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub fail_authentication: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. @@ -816,13 +822,13 @@ pub enum CognitoEventUserPoolsDefineAuthChallengeTriggerSource { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsCreateAuthChallengeRequest { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, #[serde(default)] pub challenge_name: Option, pub session: Vec>, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, #[serde(default)] @@ -843,10 +849,10 @@ pub struct CognitoEventUserPoolsCreateAuthChallengeRequest { #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsCreateAuthChallengeResponse { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub public_challenge_parameters: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub private_challenge_parameters: HashMap, #[serde(default)] @@ -901,15 +907,15 @@ where T1: DeserializeOwned, T1: Serialize, { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub user_attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub private_challenge_parameters: HashMap, #[serde(bound = "")] pub challenge_answer: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, #[serde(default)] @@ -930,7 +936,7 @@ where #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct CognitoEventUserPoolsVerifyAuthChallengeResponse { - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub answer_correct: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. @@ -1025,7 +1031,7 @@ where T1: DeserializeOwned, T1: Serialize, { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(bound = "")] pub user_attributes: HashMap, @@ -1033,7 +1039,7 @@ where pub code_parameter: Option, #[serde(default)] pub username_parameter: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub client_metadata: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. diff --git a/lambda-events/src/event/connect/mod.rs b/lambda-events/src/event/connect/mod.rs index 01c1ace6..98925ae4 100644 --- a/lambda-events/src/event/connect/mod.rs +++ b/lambda-events/src/event/connect/mod.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::deserialize_lambda_map; +use crate::custom_serde::deserialize_nullish; /// `ConnectEvent` contains the data structure for a Connect event. #[non_exhaustive] @@ -38,7 +38,7 @@ pub struct ConnectDetails { #[serde(rename = "ContactData")] pub contact_data: ConnectContactData, /// The parameters that have been set in the Connect instance at the time of the Lambda invocation. - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(rename = "Parameters")] pub parameters: HashMap, @@ -59,7 +59,7 @@ pub struct ConnectDetails { #[serde(rename_all = "camelCase")] pub struct ConnectContactData { /// The custom attributes from Connect that the Lambda function was invoked with. - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(rename = "Attributes")] pub attributes: HashMap, diff --git a/lambda-events/src/event/dynamodb/mod.rs b/lambda-events/src/event/dynamodb/mod.rs index 4dd8ca7e..b40f7751 100644 --- a/lambda-events/src/event/dynamodb/mod.rs +++ b/lambda-events/src/event/dynamodb/mod.rs @@ -1,5 +1,5 @@ use crate::{ - custom_serde::{deserialize_lambda_dynamodb_item, float_unix_epoch}, + custom_serde::{deserialize_nullish, float_unix_epoch}, streams::DynamoDbBatchItemFailure, time_window::*, }; @@ -288,17 +288,17 @@ pub struct StreamRecord { #[serde(default)] pub approximate_creation_date_time: DateTime, /// The primary key attribute(s) for the DynamoDB item that was modified. - #[serde(deserialize_with = "deserialize_lambda_dynamodb_item")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(rename = "Keys")] pub keys: serde_dynamo::Item, /// The item in the DynamoDB table as it appeared after it was modified. - #[serde(deserialize_with = "deserialize_lambda_dynamodb_item")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(rename = "NewImage")] pub new_image: serde_dynamo::Item, /// The item in the DynamoDB table as it appeared before it was modified. - #[serde(deserialize_with = "deserialize_lambda_dynamodb_item")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(rename = "OldImage")] pub old_image: serde_dynamo::Item, diff --git a/lambda-events/src/event/firehose/mod.rs b/lambda-events/src/event/firehose/mod.rs index a23c0f3d..527c5ba1 100644 --- a/lambda-events/src/event/firehose/mod.rs +++ b/lambda-events/src/event/firehose/mod.rs @@ -1,5 +1,5 @@ use crate::{ - custom_serde::deserialize_lambda_map, + custom_serde::deserialize_nullish, encodings::{Base64Data, MillisecondTimestamp}, }; #[cfg(feature = "builders")] @@ -100,7 +100,7 @@ pub struct KinesisFirehoseResponseRecord { #[derive(Debug, Default, Clone, Eq, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct KinesisFirehoseResponseRecordMetadata { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub partition_keys: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. diff --git a/lambda-events/src/event/iot_1_click/mod.rs b/lambda-events/src/event/iot_1_click/mod.rs index 981e1e66..58b6e256 100644 --- a/lambda-events/src/event/iot_1_click/mod.rs +++ b/lambda-events/src/event/iot_1_click/mod.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::deserialize_lambda_map; +use crate::custom_serde::deserialize_nullish; /// `IoTOneClickEvent` represents a click event published by clicking button type /// device. @@ -67,7 +67,7 @@ pub struct IoTOneClickButtonClicked { #[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct IoTOneClickDeviceInfo { - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub attributes: HashMap, #[serde(default)] @@ -94,10 +94,10 @@ pub struct IoTOneClickPlacementInfo { pub project_name: Option, #[serde(default)] pub placement_name: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub devices: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. diff --git a/lambda-events/src/event/kafka/mod.rs b/lambda-events/src/event/kafka/mod.rs index 5b71253c..5ca28b3d 100644 --- a/lambda-events/src/event/kafka/mod.rs +++ b/lambda-events/src/event/kafka/mod.rs @@ -1,4 +1,4 @@ -use crate::{custom_serde::deserialize_lambda_map, encodings::MillisecondTimestamp}; +use crate::{custom_serde::deserialize_nullish, encodings::MillisecondTimestamp}; #[cfg(feature = "builders")] use bon::Builder; use serde::{Deserialize, Serialize}; @@ -15,7 +15,7 @@ pub struct KafkaEvent { pub event_source: Option, #[serde(default)] pub event_source_arn: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub records: HashMap>, #[serde(default)] diff --git a/lambda-events/src/event/lambda_function_urls/mod.rs b/lambda-events/src/event/lambda_function_urls/mod.rs index 0cf1ceed..b08700a7 100644 --- a/lambda-events/src/event/lambda_function_urls/mod.rs +++ b/lambda-events/src/event/lambda_function_urls/mod.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::{deserialize_lambda_map, serialize_headers}; +use crate::custom_serde::{deserialize_nullish, serialize_headers}; /// `LambdaFunctionUrlRequest` contains data coming from the HTTP request to a Lambda Function URL. #[non_exhaustive] @@ -25,7 +25,7 @@ pub struct LambdaFunctionUrlRequest { #[serde(deserialize_with = "http_serde::header_map::deserialize", default)] #[serde(serialize_with = "serialize_headers")] pub headers: HeaderMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub query_string_parameters: HashMap, pub request_context: LambdaFunctionUrlRequestContext, diff --git a/lambda-events/src/event/lex/mod.rs b/lambda-events/src/event/lex/mod.rs index d48ae117..88c48c58 100644 --- a/lambda-events/src/event/lex/mod.rs +++ b/lambda-events/src/event/lex/mod.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::deserialize_lambda_map; +use crate::custom_serde::deserialize_nullish; #[non_exhaustive] #[cfg_attr(feature = "builders", derive(Builder))] @@ -17,7 +17,7 @@ pub struct LexEvent { pub user_id: Option, pub input_transcript: Option, pub session_attributes: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub request_attributes: HashMap, pub bot: Option, @@ -62,7 +62,7 @@ pub struct LexCurrentIntent { pub name: Option, pub nlu_intent_confidence_score: Option, pub slots: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub slot_details: HashMap, pub confirmation_status: Option, @@ -84,7 +84,7 @@ pub struct LexAlternativeIntents { pub name: Option, pub nlu_intent_confidence_score: Option, pub slots: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub slot_details: HashMap, pub confirmation_status: Option, @@ -122,7 +122,7 @@ pub struct SlotDetail { pub struct LexDialogAction { pub type_: Option, pub fulfillment_state: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub message: HashMap, pub intent_name: Option, diff --git a/lambda-events/src/event/rabbitmq/mod.rs b/lambda-events/src/event/rabbitmq/mod.rs index e9a07088..383f9347 100644 --- a/lambda-events/src/event/rabbitmq/mod.rs +++ b/lambda-events/src/event/rabbitmq/mod.rs @@ -4,7 +4,7 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::deserialize_lambda_map; +use crate::custom_serde::deserialize_nullish; #[non_exhaustive] #[cfg_attr(feature = "builders", derive(Builder))] @@ -15,7 +15,7 @@ pub struct RabbitMqEvent { pub event_source: Option, #[serde(default)] pub event_source_arn: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(rename = "rmqMessagesByQueue")] pub messages_by_queue: HashMap>, @@ -61,7 +61,7 @@ where pub content_type: Option, pub content_encoding: Option, /// Application or header exchange table - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] #[serde(bound = "")] pub headers: HashMap, diff --git a/lambda-events/src/event/s3/event.rs b/lambda-events/src/event/s3/event.rs index d93a27f8..f2d69165 100644 --- a/lambda-events/src/event/s3/event.rs +++ b/lambda-events/src/event/s3/event.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::deserialize_lambda_map; +use crate::custom_serde::deserialize_nullish; /// `S3Event` which wrap an array of `S3Event`Record #[non_exhaustive] @@ -44,7 +44,7 @@ pub struct S3EventRecord { #[serde(rename = "userIdentity")] pub principal_id: S3UserIdentity, pub request_parameters: S3RequestParameters, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub response_elements: HashMap, pub s3: S3Entity, diff --git a/lambda-events/src/event/sns/mod.rs b/lambda-events/src/event/sns/mod.rs index a8bc205e..5879bc87 100644 --- a/lambda-events/src/event/sns/mod.rs +++ b/lambda-events/src/event/sns/mod.rs @@ -6,7 +6,7 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; -use crate::custom_serde::{deserialize_lambda_map, deserialize_nullish_boolean}; +use crate::custom_serde::deserialize_nullish; /// The `Event` notification event handled by Lambda /// @@ -105,7 +105,7 @@ pub struct SnsMessage { pub message: String, /// This is a HashMap of defined attributes for a message. Additional details can be found in the [SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/sns-message-attributes.html) - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub message_attributes: HashMap, @@ -194,7 +194,7 @@ pub struct SnsSubscriptionMessage { pub message: String, /// This is a HashMap of defined attributes for a message. Additional details can be found in the [SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/sns-message-attributes.html) - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub message_attributes: HashMap, @@ -311,7 +311,7 @@ pub struct SnsMessageObj { pub message: T, /// This is a HashMap of defined attributes for a message. Additional details can be found in the [SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/sns-message-attributes.html) - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub message_attributes: HashMap, @@ -418,7 +418,7 @@ pub struct CloudWatchMetricDataQuery { pub label: Option, pub metric_stat: Option, pub period: Option, - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub return_data: bool, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. /// Enabled with Cargo feature `catch-all-fields`. diff --git a/lambda-events/src/event/sqs/mod.rs b/lambda-events/src/event/sqs/mod.rs index b33ac267..3209e0f5 100644 --- a/lambda-events/src/event/sqs/mod.rs +++ b/lambda-events/src/event/sqs/mod.rs @@ -1,4 +1,4 @@ -use crate::{custom_serde::deserialize_lambda_map, encodings::Base64Data}; +use crate::{custom_serde::deserialize_nullish, encodings::Base64Data}; #[cfg(feature = "builders")] use bon::Builder; use serde::{de::DeserializeOwned, Deserialize, Serialize}; @@ -41,10 +41,10 @@ pub struct SqsMessage { pub md5_of_body: Option, #[serde(default)] pub md5_of_message_attributes: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub message_attributes: HashMap, #[serde(default)] @@ -106,10 +106,10 @@ pub struct SqsMessageObj { pub md5_of_body: Option, #[serde(default)] pub md5_of_message_attributes: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub message_attributes: HashMap, #[serde(default)] @@ -355,10 +355,10 @@ pub struct SqsApiMessageObj { pub md5_of_body: Option, #[serde(default)] pub md5_of_message_attributes: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub message_attributes: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. @@ -388,10 +388,10 @@ pub struct SqsApiMessage { pub md5_of_body: Option, #[serde(default)] pub md5_of_message_attributes: Option, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub attributes: HashMap, - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub message_attributes: HashMap, /// Catchall to catch any additional fields that were present but not explicitly defined by this struct. diff --git a/lambda-events/src/event/vpc_lattice/v1.rs b/lambda-events/src/event/vpc_lattice/v1.rs index dc382c43..4ab423ff 100644 --- a/lambda-events/src/event/vpc_lattice/v1.rs +++ b/lambda-events/src/event/vpc_lattice/v1.rs @@ -8,8 +8,7 @@ use serde_json::Value; use crate::{ custom_serde::{ - deserialize_comma_separated_headers, deserialize_nullish_boolean, http_method, - serialize_comma_separated_headers, + deserialize_comma_separated_headers, deserialize_nullish, http_method, serialize_comma_separated_headers, }, encodings::Body, }; @@ -50,7 +49,7 @@ pub struct VpcLatticeRequestV1 { pub body: Option, /// Whether the body is base64 encoded - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub is_base64_encoded: bool, /// Catchall to catch any additional fields diff --git a/lambda-events/src/event/vpc_lattice/v2.rs b/lambda-events/src/event/vpc_lattice/v2.rs index 7cfcc2a0..eafed888 100644 --- a/lambda-events/src/event/vpc_lattice/v2.rs +++ b/lambda-events/src/event/vpc_lattice/v2.rs @@ -1,5 +1,5 @@ use crate::{ - custom_serde::{deserialize_headers, deserialize_nullish_boolean, http_method, serialize_multi_value_headers}, + custom_serde::{deserialize_headers, deserialize_nullish, http_method, serialize_multi_value_headers}, encodings::Body, }; #[cfg(feature = "builders")] @@ -50,7 +50,7 @@ pub struct VpcLatticeRequestV2 { pub body: Option, /// Whether the body is base64 encoded - #[serde(default, deserialize_with = "deserialize_nullish_boolean")] + #[serde(default, deserialize_with = "deserialize_nullish")] pub is_base64_encoded: bool, /// VPC Lattice specific request context diff --git a/lambda-events/src/time_window.rs b/lambda-events/src/time_window.rs index d67a8e91..35c03897 100644 --- a/lambda-events/src/time_window.rs +++ b/lambda-events/src/time_window.rs @@ -2,7 +2,7 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use crate::custom_serde::deserialize_lambda_map; +use crate::custom_serde::deserialize_nullish; /// `Window` is the object that captures the time window for the records in the event when using the tumbling windows feature /// Kinesis: @@ -34,7 +34,7 @@ pub struct TimeWindowProperties { /// Time window for the records in the event. pub window: Window, /// State being built up to this invoke in the time window. - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub state: HashMap, /// Shard id of the records @@ -60,7 +60,7 @@ pub struct TimeWindowProperties { #[serde(rename_all = "camelCase")] pub struct TimeWindowEventResponseProperties { /// State being built up to this invoke in the time window. - #[serde(deserialize_with = "deserialize_lambda_map")] + #[serde(deserialize_with = "deserialize_nullish")] #[serde(default)] pub state: HashMap, }