use common_enums::enums; use serde::{Deserialize, Serialize}; use masking::Secret; use common_utils::types::{StringMinorUnit}; use hyperswitch_domain_models::{ payment_method_data::PaymentMethodData, router_data::{ConnectorAuthType, RouterData}, router_flow_types::refunds::{Execute, RSync}, router_request_types::ResponseId, router_response_types::{PaymentsResponseData, RefundsResponseData}, types::{PaymentsAuthorizeRouterData, RefundsRouterData}, }; use hyperswitch_interfaces::errors; use crate::types::{RefundsResponseRouterData, ResponseRouterData}; //TODO: Fill the struct with respective fields pub struct {{project-name | downcase | pascal_case}}RouterData { pub amount: StringMinorUnit, // The type of amount that a connector accepts, for example, String, i64, f64, etc. pub router_data: T, } impl From<( StringMinorUnit, T, )> for {{project-name | downcase | pascal_case}}RouterData { fn from( (amount, item): ( StringMinorUnit, T, ), ) -> Self { //Todo : use utils to convert the amount to the type of amount that a connector accepts Self { amount, router_data: item, } } } //TODO: Fill the struct with respective fields #[derive(Default, Debug, Serialize, PartialEq)] pub struct {{project-name | downcase | pascal_case}}PaymentsRequest { amount: StringMinorUnit, card: {{project-name | downcase | pascal_case}}Card } #[derive(Default, Debug, Serialize, Eq, PartialEq)] pub struct {{project-name | downcase | pascal_case}}Card { number: cards::CardNumber, expiry_month: Secret, expiry_year: Secret, cvc: Secret, complete: bool, } impl TryFrom<&{{project-name | downcase | pascal_case}}RouterData<&PaymentsAuthorizeRouterData>> for {{project-name | downcase | pascal_case}}PaymentsRequest { type Error = error_stack::Report; fn try_from(item: &{{project-name | downcase | pascal_case}}RouterData<&PaymentsAuthorizeRouterData>) -> Result { match item.router_data.request.payment_method_data.clone() { PaymentMethodData::Card(_) => { Err(errors::ConnectorError::NotImplemented("Card payment method not implemented".to_string()).into()) }, _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), } } } //TODO: Fill the struct with respective fields // Auth Struct pub struct {{project-name | downcase | pascal_case}}AuthType { pub(super) api_key: Secret } impl TryFrom<&ConnectorAuthType> for {{project-name | downcase | pascal_case}}AuthType { type Error = error_stack::Report; fn try_from(auth_type: &ConnectorAuthType) -> Result { match auth_type { ConnectorAuthType::HeaderKey { api_key } => Ok(Self { api_key: api_key.to_owned(), }), _ => Err(errors::ConnectorError::FailedToObtainAuthType.into()), } } } // PaymentsResponse //TODO: Append the remaining status flags #[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "lowercase")] pub enum {{project-name | downcase | pascal_case}}PaymentStatus { Succeeded, Failed, #[default] Processing, } impl From<{{project-name | downcase | pascal_case}}PaymentStatus> for common_enums::AttemptStatus { fn from(item: {{project-name | downcase | pascal_case}}PaymentStatus) -> Self { match item { {{project-name | downcase | pascal_case}}PaymentStatus::Succeeded => Self::Charged, {{project-name | downcase | pascal_case}}PaymentStatus::Failed => Self::Failure, {{project-name | downcase | pascal_case}}PaymentStatus::Processing => Self::Authorizing, } } } //TODO: Fill the struct with respective fields #[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct {{project-name | downcase | pascal_case}}PaymentsResponse { status: {{project-name | downcase | pascal_case}}PaymentStatus, id: String, } impl TryFrom> for RouterData { type Error = error_stack::Report; fn try_from(item: ResponseRouterData) -> Result { Ok(Self { status: common_enums::AttemptStatus::from(item.response.status), response: Ok(PaymentsResponseData::TransactionResponse { resource_id: ResponseId::ConnectorTransactionId(item.response.id), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, network_txn_id: None, connector_response_reference_id: None, incremental_authorization_allowed: None, charges: None, }), ..item.data }) } } //TODO: Fill the struct with respective fields // REFUND : // Type definition for RefundRequest #[derive(Default, Debug, Serialize)] pub struct {{project-name | downcase | pascal_case}}RefundRequest { pub amount: StringMinorUnit } impl TryFrom<&{{project-name | downcase | pascal_case}}RouterData<&RefundsRouterData>> for {{project-name | downcase | pascal_case}}RefundRequest { type Error = error_stack::Report; fn try_from(item: &{{project-name | downcase | pascal_case}}RouterData<&RefundsRouterData>) -> Result { Ok(Self { amount: item.amount.to_owned(), }) } } // Type definition for Refund Response #[allow(dead_code)] #[derive(Debug, Copy, Serialize, Default, Deserialize, Clone)] pub enum RefundStatus { Succeeded, Failed, #[default] Processing, } impl From for enums::RefundStatus { fn from(item: RefundStatus) -> Self { match item { RefundStatus::Succeeded => Self::Success, RefundStatus::Failed => Self::Failure, RefundStatus::Processing => Self::Pending, //TODO: Review mapping } } } //TODO: Fill the struct with respective fields #[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct RefundResponse { id: String, status: RefundStatus } impl TryFrom> for RefundsRouterData { type Error = error_stack::Report; fn try_from( item: RefundsResponseRouterData, ) -> Result { Ok(Self { response: Ok(RefundsResponseData { connector_refund_id: item.response.id.to_string(), refund_status: enums::RefundStatus::from(item.response.status), }), ..item.data }) } } impl TryFrom> for RefundsRouterData { type Error = error_stack::Report; fn try_from(item: RefundsResponseRouterData) -> Result { Ok(Self { response: Ok(RefundsResponseData { connector_refund_id: item.response.id.to_string(), refund_status: enums::RefundStatus::from(item.response.status), }), ..item.data }) } } //TODO: Fill the struct with respective fields #[derive(Default, Debug, Serialize, Deserialize, PartialEq)] pub struct {{project-name | downcase | pascal_case}}ErrorResponse { pub status_code: u16, pub code: String, pub message: String, pub reason: Option, pub network_advice_code: Option, pub network_decline_code: Option, pub network_error_message: Option, }