use serde::{Deserialize, Serialize}; use masking::Secret; use crate::{connector::utils::{PaymentsAuthorizeRequestData},core::errors,types::{self, domain, api, storage::enums}}; //TODO: Fill the struct with respective fields pub struct {{project-name | downcase | pascal_case}}RouterData { pub amount: MinorUnit, // The type of amount that a connector accepts, for example, String, i64, f64, etc. pub router_data: T, } impl TryFrom<( &types::api::CurrencyUnit, types::storage::enums::Currency, i64, T, )> for {{project-name | downcase | pascal_case}}RouterData { type Error = error_stack::Report; fn try_from( (_currency_unit, _currency, amount, item): ( &types::api::CurrencyUnit, types::storage::enums::Currency, i64, T, ), ) -> Result { //Todo : use utils to convert the amount to the type of amount that a connector accepts Ok(Self { amount, router_data: item, }) } } //TODO: Fill the struct with respective fields #[derive(Default, Debug, Serialize, Eq, PartialEq)] pub struct {{project-name | downcase | pascal_case}}PaymentsRequest { amount: i64, 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<&types::PaymentsAuthorizeRouterData>> for {{project-name | downcase | pascal_case}}PaymentsRequest { type Error = error_stack::Report; fn try_from(item: &{{project-name | downcase | pascal_case}}RouterData<&types::PaymentsAuthorizeRouterData>) -> Result { match item.router_data.request.payment_method_data.clone() { domain::PaymentMethodData::Card(req_card) => { let card = {{project-name | downcase | pascal_case}}Card { number: req_card.card_number, expiry_month: req_card.card_exp_month, expiry_year: req_card.card_exp_year, cvc: req_card.card_cvc, complete: item.router_data.request.is_auto_capture()?, }; Ok(Self { amount: item.amount.to_owned(), card, }) } _ => Err(errors::ConnectorError::NotImplemented("Payment methods".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<&types::ConnectorAuthType> for {{project-name | downcase | pascal_case}}AuthType { type Error = error_stack::Report; fn try_from(auth_type: &types::ConnectorAuthType) -> Result { match auth_type { types::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, 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 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 types::RouterData { type Error = error_stack::Report; fn try_from(item: types::ResponseRouterData) -> Result { Ok(Self { status: enums::AttemptStatus::from(item.response.status), response: Ok(types::PaymentsResponseData::TransactionResponse { resource_id: types::ResponseId::ConnectorTransactionId(item.response.id), redirection_data: None, mandate_reference: None, connector_metadata: None, network_txn_id: None, connector_response_reference_id: None, incremental_authorization_allowed: None, charge_id: 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: MinorUnit } impl TryFrom<&{{project-name | downcase | pascal_case}}RouterData<&types::RefundsRouterData>> for {{project-name | downcase | pascal_case}}RefundRequest { type Error = error_stack::Report; fn try_from(item: &{{project-name | downcase | pascal_case}}RouterData<&types::RefundsRouterData>) -> Result { Ok(Self { amount: item.amount.to_owned(), }) } } // Type definition for Refund Response #[allow(dead_code)] #[derive(Debug, 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 types::RefundsRouterData { type Error = error_stack::Report; fn try_from( item: types::RefundsResponseRouterData, ) -> Result { Ok(Self { response: Ok(types::RefundsResponseData { connector_refund_id: item.response.id.to_string(), refund_status: enums::RefundStatus::from(item.response.status), }), ..item.data }) } } impl TryFrom> for types::RefundsRouterData { type Error = error_stack::Report; fn try_from(item: types::RefundsResponseRouterData) -> Result { Ok(Self { response: Ok(types::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, }