diff --git a/crates/api_models/src/payment_methods.rs b/crates/api_models/src/payment_methods.rs index 858ddf8023..1fb1147b63 100644 --- a/crates/api_models/src/payment_methods.rs +++ b/crates/api_models/src/payment_methods.rs @@ -167,7 +167,7 @@ fn set_or_reject_duplicate( } } -#[derive(Eq, PartialEq, Hash, Debug, serde::Serialize, serde::Deserialize)] +#[derive(Eq, PartialEq, Hash, Debug, serde::Deserialize)] pub struct ListPaymentMethodResponse { pub payment_method: api_enums::PaymentMethodType, pub payment_method_types: Option>, @@ -183,6 +183,32 @@ pub struct ListPaymentMethodResponse { pub payment_experience: Option>, } +/// We need a custom serializer to only send relevant fields in ListPaymentMethodResponse +/// Currently if the payment method is Wallet or Paylater the relevant fields are `payment_method` +/// and `payment_method_issuers`. Otherwise only consider +/// `payment_method`,`payment_method_issuers`,`payment_method_types`,`payment_schemes` fields. +impl serde::Serialize for ListPaymentMethodResponse { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut state = serializer.serialize_struct("ListPaymentMethodResponse", 4)?; + state.serialize_field("payment_method", &self.payment_method)?; + match self.payment_method { + api_enums::PaymentMethodType::Wallet | api_enums::PaymentMethodType::PayLater => { + state.serialize_field("payment_method_issuers", &self.payment_method_issuers)?; + } + _ => { + state.serialize_field("payment_method_issuers", &self.payment_method_issuers)?; + state.serialize_field("payment_method_types", &self.payment_method_types)?; + state.serialize_field("payment_schemes", &self.payment_schemes)?; + } + } + state.end() + } +} + #[derive(Debug, serde::Serialize)] pub struct ListCustomerPaymentMethodsResponse { pub enabled_payment_methods: collections::HashSet,