mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 18:17:13 +08:00 
			
		
		
		
	refactor: use strum::EnumString implementation for connector name conversions (#1052)
				
					
				
			Co-authored-by: Sanchith Hegde <22217505+SanchithHegde@users.noreply.github.com>
This commit is contained in:
		| @ -569,7 +569,6 @@ pub enum MandateStatus { | |||||||
|     Clone, |     Clone, | ||||||
|     Copy, |     Copy, | ||||||
|     Debug, |     Debug, | ||||||
|     Default, |  | ||||||
|     Eq, |     Eq, | ||||||
|     PartialEq, |     PartialEq, | ||||||
|     ToSchema, |     ToSchema, | ||||||
| @ -586,7 +585,6 @@ pub enum Connector { | |||||||
|     Aci, |     Aci, | ||||||
|     Adyen, |     Adyen, | ||||||
|     Airwallex, |     Airwallex, | ||||||
|     Applepay, |  | ||||||
|     Authorizedotnet, |     Authorizedotnet, | ||||||
|     Bitpay, |     Bitpay, | ||||||
|     Bluesnap, |     Bluesnap, | ||||||
| @ -594,8 +592,6 @@ pub enum Connector { | |||||||
|     Checkout, |     Checkout, | ||||||
|     Coinbase, |     Coinbase, | ||||||
|     Cybersource, |     Cybersource, | ||||||
|     #[default] |  | ||||||
|     Dummy, |  | ||||||
|     Iatapay, |     Iatapay, | ||||||
|     #[cfg(feature = "dummy_connector")] |     #[cfg(feature = "dummy_connector")] | ||||||
|     #[serde(rename = "dummyconnector1")] |     #[serde(rename = "dummyconnector1")] | ||||||
| @ -632,7 +628,6 @@ pub enum Connector { | |||||||
|     Worldline, |     Worldline, | ||||||
|     Worldpay, |     Worldpay, | ||||||
|     Zen, |     Zen, | ||||||
|     Signifyd, |  | ||||||
| } | } | ||||||
|  |  | ||||||
| impl Connector { | impl Connector { | ||||||
|  | |||||||
| @ -199,50 +199,94 @@ impl ConnectorData { | |||||||
|         _connectors: &Connectors, |         _connectors: &Connectors, | ||||||
|         connector_name: &str, |         connector_name: &str, | ||||||
|     ) -> CustomResult<BoxedConnector, errors::ApiErrorResponse> { |     ) -> CustomResult<BoxedConnector, errors::ApiErrorResponse> { | ||||||
|         match connector_name { |         match enums::Connector::from_str(connector_name) { | ||||||
|             "aci" => Ok(Box::new(&connector::Aci)), |             Ok(name) => match name { | ||||||
|             "adyen" => Ok(Box::new(&connector::Adyen)), |                 enums::Connector::Aci => Ok(Box::new(&connector::Aci)), | ||||||
|             "airwallex" => Ok(Box::new(&connector::Airwallex)), |                 enums::Connector::Adyen => Ok(Box::new(&connector::Adyen)), | ||||||
|             "authorizedotnet" => Ok(Box::new(&connector::Authorizedotnet)), |                 enums::Connector::Airwallex => Ok(Box::new(&connector::Airwallex)), | ||||||
|             "bambora" => Ok(Box::new(&connector::Bambora)), |                 enums::Connector::Authorizedotnet => Ok(Box::new(&connector::Authorizedotnet)), | ||||||
|             "bitpay" => Ok(Box::new(&connector::Bitpay)), |                 enums::Connector::Bambora => Ok(Box::new(&connector::Bambora)), | ||||||
|             "bluesnap" => Ok(Box::new(&connector::Bluesnap)), |                 enums::Connector::Bitpay => Ok(Box::new(&connector::Bitpay)), | ||||||
|             "braintree" => Ok(Box::new(&connector::Braintree)), |                 enums::Connector::Bluesnap => Ok(Box::new(&connector::Bluesnap)), | ||||||
|             "checkout" => Ok(Box::new(&connector::Checkout)), |                 enums::Connector::Braintree => Ok(Box::new(&connector::Braintree)), | ||||||
|             "coinbase" => Ok(Box::new(&connector::Coinbase)), |                 enums::Connector::Checkout => Ok(Box::new(&connector::Checkout)), | ||||||
|             "cybersource" => Ok(Box::new(&connector::Cybersource)), |                 enums::Connector::Coinbase => Ok(Box::new(&connector::Coinbase)), | ||||||
|             "dlocal" => Ok(Box::new(&connector::Dlocal)), |                 enums::Connector::Cybersource => Ok(Box::new(&connector::Cybersource)), | ||||||
|  |                 enums::Connector::Dlocal => Ok(Box::new(&connector::Dlocal)), | ||||||
|                 #[cfg(feature = "dummy_connector")] |                 #[cfg(feature = "dummy_connector")] | ||||||
|             "dummyconnector1" => Ok(Box::new(&connector::DummyConnector::<1>)), |                 enums::Connector::DummyConnector1 => Ok(Box::new(&connector::DummyConnector::<1>)), | ||||||
|                 #[cfg(feature = "dummy_connector")] |                 #[cfg(feature = "dummy_connector")] | ||||||
|             "dummyconnector2" => Ok(Box::new(&connector::DummyConnector::<2>)), |                 enums::Connector::DummyConnector2 => Ok(Box::new(&connector::DummyConnector::<2>)), | ||||||
|                 #[cfg(feature = "dummy_connector")] |                 #[cfg(feature = "dummy_connector")] | ||||||
|             "dummyconnector3" => Ok(Box::new(&connector::DummyConnector::<3>)), |                 enums::Connector::DummyConnector3 => Ok(Box::new(&connector::DummyConnector::<3>)), | ||||||
|             "fiserv" => Ok(Box::new(&connector::Fiserv)), |                 enums::Connector::Fiserv => Ok(Box::new(&connector::Fiserv)), | ||||||
|             "forte" => Ok(Box::new(&connector::Forte)), |                 enums::Connector::Forte => Ok(Box::new(&connector::Forte)), | ||||||
|             "globalpay" => Ok(Box::new(&connector::Globalpay)), |                 enums::Connector::Globalpay => Ok(Box::new(&connector::Globalpay)), | ||||||
|             "iatapay" => Ok(Box::new(&connector::Iatapay)), |                 enums::Connector::Iatapay => Ok(Box::new(&connector::Iatapay)), | ||||||
|             "klarna" => Ok(Box::new(&connector::Klarna)), |                 enums::Connector::Klarna => Ok(Box::new(&connector::Klarna)), | ||||||
|             "mollie" => Ok(Box::new(&connector::Mollie)), |                 enums::Connector::Mollie => Ok(Box::new(&connector::Mollie)), | ||||||
|             "nmi" => Ok(Box::new(&connector::Nmi)), |                 enums::Connector::Nmi => Ok(Box::new(&connector::Nmi)), | ||||||
|                 // "noon" => Ok(Box::new(&connector::Noon)), added as template code for future usage |                 // "noon" => Ok(Box::new(&connector::Noon)), added as template code for future usage | ||||||
|             "nuvei" => Ok(Box::new(&connector::Nuvei)), |                 enums::Connector::Nuvei => Ok(Box::new(&connector::Nuvei)), | ||||||
|             "opennode" => Ok(Box::new(&connector::Opennode)), |                 enums::Connector::Opennode => Ok(Box::new(&connector::Opennode)), | ||||||
|                 // "payeezy" => Ok(Box::new(&connector::Payeezy)), As psync and rsync are not supported by this connector, it is added as template code for future usage |                 // "payeezy" => Ok(Box::new(&connector::Payeezy)), As psync and rsync are not supported by this connector, it is added as template code for future usage | ||||||
|             "payu" => Ok(Box::new(&connector::Payu)), |                 enums::Connector::Payu => Ok(Box::new(&connector::Payu)), | ||||||
|             "rapyd" => Ok(Box::new(&connector::Rapyd)), |                 enums::Connector::Rapyd => Ok(Box::new(&connector::Rapyd)), | ||||||
|             "shift4" => Ok(Box::new(&connector::Shift4)), |                 enums::Connector::Shift4 => Ok(Box::new(&connector::Shift4)), | ||||||
|             "stripe" => Ok(Box::new(&connector::Stripe)), |                 enums::Connector::Stripe => Ok(Box::new(&connector::Stripe)), | ||||||
|             "worldline" => Ok(Box::new(&connector::Worldline)), |                 enums::Connector::Worldline => Ok(Box::new(&connector::Worldline)), | ||||||
|             "worldpay" => Ok(Box::new(&connector::Worldpay)), |                 enums::Connector::Worldpay => Ok(Box::new(&connector::Worldpay)), | ||||||
|             "multisafepay" => Ok(Box::new(&connector::Multisafepay)), |                 enums::Connector::Multisafepay => Ok(Box::new(&connector::Multisafepay)), | ||||||
|             "nexinets" => Ok(Box::new(&connector::Nexinets)), |                 enums::Connector::Nexinets => Ok(Box::new(&connector::Nexinets)), | ||||||
|             "paypal" => Ok(Box::new(&connector::Paypal)), |                 enums::Connector::Paypal => Ok(Box::new(&connector::Paypal)), | ||||||
|             "trustpay" => Ok(Box::new(&connector::Trustpay)), |                 enums::Connector::Trustpay => Ok(Box::new(&connector::Trustpay)), | ||||||
|             "zen" => Ok(Box::new(&connector::Zen)), |                 enums::Connector::Zen => Ok(Box::new(&connector::Zen)), | ||||||
|             _ => Err(report!(errors::ConnectorError::InvalidConnectorName) |             }, | ||||||
|  |             Err(_) => Err(report!(errors::ConnectorError::InvalidConnectorName) | ||||||
|                 .attach_printable(format!("invalid connector name: {connector_name}"))) |                 .attach_printable(format!("invalid connector name: {connector_name}"))) | ||||||
|             .change_context(errors::ApiErrorResponse::InternalServerError), |             .change_context(errors::ApiErrorResponse::InternalServerError), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[cfg(test)] | ||||||
|  | mod test { | ||||||
|  |     #![allow(clippy::unwrap_used)] | ||||||
|  |     use super::*; | ||||||
|  |  | ||||||
|  |     #[test] | ||||||
|  |     fn test_convert_connector_parsing_success() { | ||||||
|  |         let result = enums::Connector::from_str("aci"); | ||||||
|  |         assert!(result.is_ok()); | ||||||
|  |         assert_eq!(result.unwrap(), enums::Connector::Aci); | ||||||
|  |  | ||||||
|  |         let result = enums::Connector::from_str("shift4"); | ||||||
|  |         assert!(result.is_ok()); | ||||||
|  |         assert_eq!(result.unwrap(), enums::Connector::Shift4); | ||||||
|  |  | ||||||
|  |         let result = enums::Connector::from_str("authorizedotnet"); | ||||||
|  |         assert!(result.is_ok()); | ||||||
|  |         assert_eq!(result.unwrap(), enums::Connector::Authorizedotnet); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     #[test] | ||||||
|  |     fn test_convert_connector_parsing_fail_for_unknown_type() { | ||||||
|  |         let result = enums::Connector::from_str("unknowntype"); | ||||||
|  |         assert!(result.is_err()); | ||||||
|  |  | ||||||
|  |         let result = enums::Connector::from_str("randomstring"); | ||||||
|  |         assert!(result.is_err()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     #[test] | ||||||
|  |     fn test_convert_connector_parsing_fail_for_camel_case() { | ||||||
|  |         let result = enums::Connector::from_str("Paypal"); | ||||||
|  |         assert!(result.is_err()); | ||||||
|  |  | ||||||
|  |         let result = enums::Connector::from_str("Authorizedotnet"); | ||||||
|  |         assert!(result.is_err()); | ||||||
|  |  | ||||||
|  |         let result = enums::Connector::from_str("Opennode"); | ||||||
|  |         assert!(result.is_err()); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ pub struct RoutingData { | |||||||
| impl crate::utils::storage_partitioning::KvStorePartition for PaymentAttempt {} | impl crate::utils::storage_partitioning::KvStorePartition for PaymentAttempt {} | ||||||
|  |  | ||||||
| #[cfg(test)] | #[cfg(test)] | ||||||
|  | #[cfg(feature = "dummy_connector")] | ||||||
| mod tests { | mod tests { | ||||||
|     #![allow(clippy::expect_used, clippy::unwrap_used)] |     #![allow(clippy::expect_used, clippy::unwrap_used)] | ||||||
|     use tokio::sync::oneshot; |     use tokio::sync::oneshot; | ||||||
| @ -34,7 +35,7 @@ mod tests { | |||||||
|  |  | ||||||
|         let payment_id = Uuid::new_v4().to_string(); |         let payment_id = Uuid::new_v4().to_string(); | ||||||
|         let current_time = common_utils::date_time::now(); |         let current_time = common_utils::date_time::now(); | ||||||
|         let connector = types::Connector::Dummy.to_string(); |         let connector = types::Connector::DummyConnector1.to_string(); | ||||||
|         let payment_attempt = PaymentAttemptNew { |         let payment_attempt = PaymentAttemptNew { | ||||||
|             payment_id: payment_id.clone(), |             payment_id: payment_id.clone(), | ||||||
|             connector: Some(connector), |             connector: Some(connector), | ||||||
| @ -66,7 +67,7 @@ mod tests { | |||||||
|         let payment_id = Uuid::new_v4().to_string(); |         let payment_id = Uuid::new_v4().to_string(); | ||||||
|         let attempt_id = Uuid::new_v4().to_string(); |         let attempt_id = Uuid::new_v4().to_string(); | ||||||
|         let merchant_id = Uuid::new_v4().to_string(); |         let merchant_id = Uuid::new_v4().to_string(); | ||||||
|         let connector = types::Connector::Dummy.to_string(); |         let connector = types::Connector::DummyConnector1.to_string(); | ||||||
|  |  | ||||||
|         let payment_attempt = PaymentAttemptNew { |         let payment_attempt = PaymentAttemptNew { | ||||||
|             payment_id: payment_id.clone(), |             payment_id: payment_id.clone(), | ||||||
| @ -105,11 +106,11 @@ mod tests { | |||||||
|     async fn test_payment_attempt_mandate_field() { |     async fn test_payment_attempt_mandate_field() { | ||||||
|         use crate::configs::settings::Settings; |         use crate::configs::settings::Settings; | ||||||
|         let conf = Settings::new().expect("invalid settings"); |         let conf = Settings::new().expect("invalid settings"); | ||||||
|         let uuid = uuid::Uuid::new_v4().to_string(); |         let uuid = Uuid::new_v4().to_string(); | ||||||
|         let tx: oneshot::Sender<()> = oneshot::channel().0; |         let tx: oneshot::Sender<()> = oneshot::channel().0; | ||||||
|         let state = routes::AppState::with_storage(conf, StorageImpl::PostgresqlTest, tx).await; |         let state = routes::AppState::with_storage(conf, StorageImpl::PostgresqlTest, tx).await; | ||||||
|         let current_time = common_utils::date_time::now(); |         let current_time = common_utils::date_time::now(); | ||||||
|         let connector = types::Connector::Dummy.to_string(); |         let connector = types::Connector::DummyConnector1.to_string(); | ||||||
|  |  | ||||||
|         let payment_attempt = PaymentAttemptNew { |         let payment_attempt = PaymentAttemptNew { | ||||||
|             payment_id: uuid.clone(), |             payment_id: uuid.clone(), | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ impl utils::Connector for NoonTest { | |||||||
|         use router::connector::Noon; |         use router::connector::Noon; | ||||||
|         types::api::ConnectorData { |         types::api::ConnectorData { | ||||||
|             connector: Box::new(&Noon), |             connector: Box::new(&Noon), | ||||||
|             connector_name: types::Connector::Dummy, |             connector_name: types::Connector::DummyConnector1, | ||||||
|             get_token: types::api::GetToken::Connector, |             get_token: types::api::GetToken::Connector, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ impl utils::Connector for PayeezyTest { | |||||||
|         use router::connector::Payeezy; |         use router::connector::Payeezy; | ||||||
|         types::api::ConnectorData { |         types::api::ConnectorData { | ||||||
|             connector: Box::new(&Payeezy), |             connector: Box::new(&Payeezy), | ||||||
|             connector_name: types::Connector::Dummy, |             connector_name: types::Connector::DummyConnector1, | ||||||
|             get_token: types::api::GetToken::Connector, |             get_token: types::api::GetToken::Connector, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Nachiket Kanore
					Nachiket Kanore