message: chore: Only serialize non-None option values in MessageAttributes
  Otherwise we'll end up with a lot of null JSON fields in the message.
diff: @@ -161,17 +161,17 @@ impl Test {
  #[derive(Clone, Debug, PartialEq)]
  #[cfg_attr(feature = "serialize_json", derive(Serialize, Deserialize))]
  pub struct MessageAttributes {
  - #[cfg_attr(feature = "serialize_json", serde(rename = "FeatureCount"))]
  + #[cfg_attr(feature = "serialize_json", serde(rename = "FeatureCount"), serde(skip_serializing_if = "Option::is_none"))]
  pub feature_count: Option<u32>,
  - #[cfg_attr(feature = "serialize_json", serde(rename = "StepCount"))]
  + #[cfg_attr(feature = "serialize_json", serde(rename = "StepCount"), serde(skip_serializing_if = "Option::is_none"))]
  pub step_count: Option<Vec<u32>>,
  - #[cfg_attr(feature = "serialize_json", serde(rename = "Endpoints"))]
  + #[cfg_attr(feature = "serialize_json", serde(rename = "Endpoints"), serde(skip_serializing_if = "Option::is_none"))]
  pub endpoints: Option<Vec<Endpoint>>,
  - #[cfg_attr(feature = "serialize_json", serde(rename = "MaxDuration"))]
  + #[cfg_attr(feature = "serialize_json", serde(rename = "MaxDuration"), serde(skip_serializing_if = "Option::is_none"))]
  pub max_duration: Option<Vec<u32>>,
  - #[cfg_attr(feature = "serialize_json", serde(rename = "Patterns"))]
  + #[cfg_attr(feature = "serialize_json", serde(rename = "Patterns"), serde(skip_serializing_if = "Option::is_none"))]
  pub patterns: Option<Vec<Vec<String>>>,
  - #[cfg_attr(feature = "serialize_json", serde(rename = "ActuatorType"))]
  + #[cfg_attr(feature = "serialize_json", serde(rename = "ActuatorType"), serde(skip_serializing_if = "Option::is_none"))]
  pub actuator_type: Option<Vec<String>>,
  }
  