Bug: [FEATURE] Use empty enums instead of unit structs for PII masking strategies



### Feature Description

Currently, we make use of unit structs that implement the `masking::Strategy<T>` trait to represent PII masking strategies. We would like to replace these with empty enums instead (So `struct MyStrategy;` becomes `enum MyStrategy {}`).

The difference between the two is that you can still construct a value out of a unit struct, but you can never construct a value out of an empty enum (since it has no variants to construct). However, you can still use empty enums as type parameters to generic constructs like the `masking::Secret<Data, Strategy>` type.

The argument against this is that we wouldn't be able to construct a `dyn masking::Strategy<T>`, but ideally, owing to the current implementation of PII masking in Hyperswitch, we should never have the need to obtain a `dyn masking::Strategy<T>` trait object.

### Possible Implementation

For all unit structs that implement `masking::Strategy<T>`, convert them to unit enums.

### Have you spent some time checking if this feature request has been raised before?

- [X] I checked and didn't find a similar issue

### Have you read the Contributing Guidelines?

- [X] I have read the [Contributing Guidelines](https://github.com/juspay/hyperswitch/blob/main/docs/CONTRIBUTING.md)

### Are you willing to submit a PR?

No, but I'm happy to collaborate on a PR with someone else
diff --git a/crates/cards/src/validate.rs b/crates/cards/src/validate.rs
index db6957057ec..d083a420a1e 100644
--- a/crates/cards/src/validate.rs
+++ b/crates/cards/src/validate.rs
@@ -72,7 +72,7 @@ impl<'de> Deserialize<'de> for CardNumber {
     }
 }
 
-pub struct CardNumberStrategy;
+pub enum CardNumberStrategy {}
 
 impl<T> Strategy<T> for CardNumberStrategy
 where
diff --git a/crates/common_utils/src/pii.rs b/crates/common_utils/src/pii.rs
index c246d204226..39793de5c2b 100644
--- a/crates/common_utils/src/pii.rs
+++ b/crates/common_utils/src/pii.rs
@@ -27,7 +27,7 @@ pub type SecretSerdeValue = Secret<serde_json::Value>;
 
 /// Strategy for masking a PhoneNumber
 #[derive(Debug)]
-pub struct PhoneNumberStrategy;
+pub enum PhoneNumberStrategy {}
 
 /// Phone Number
 #[derive(Debug, serde::Deserialize, serde::Serialize)]
@@ -144,7 +144,7 @@ where
 
 /// Strategy for Encryption
 #[derive(Debug)]
-pub struct EncryptionStratergy;
+pub enum EncryptionStratergy {}
 
 impl<T> Strategy<T> for EncryptionStratergy
 where
@@ -157,7 +157,7 @@ where
 
 /// Client secret
 #[derive(Debug)]
-pub struct ClientSecret;
+pub enum ClientSecret {}
 
 impl<T> Strategy<T> for ClientSecret
 where
@@ -189,7 +189,7 @@ where
 
 /// Strategy for masking Email
 #[derive(Debug)]
-pub struct EmailStrategy;
+pub enum EmailStrategy {}
 
 impl<T> Strategy<T> for EmailStrategy
 where
@@ -305,7 +305,7 @@ impl FromStr for Email {
 
 /// IP address
 #[derive(Debug)]
-pub struct IpAddress;
+pub enum IpAddress {}
 
 impl<T> Strategy<T> for IpAddress
 where
@@ -332,7 +332,7 @@ where
 /// Strategy for masking UPI VPA's
 
 #[derive(Debug)]
-pub struct UpiVpaMaskingStrategy;
+pub enum UpiVpaMaskingStrategy {}
 
 impl<T> Strategy<T> for UpiVpaMaskingStrategy
 where
diff --git a/crates/masking/src/secret.rs b/crates/masking/src/secret.rs
index 96411d4632b..b2e9124688c 100644
--- a/crates/masking/src/secret.rs
+++ b/crates/masking/src/secret.rs
@@ -12,8 +12,8 @@ use crate::{strategy::Strategy, PeekInterface};
 /// To get access to value use method `expose()` of trait [`crate::ExposeInterface`].
 ///
 /// ## Masking
-/// Use the [`crate::strategy::Strategy`] trait to implement a masking strategy on a unit struct
-/// and pass the unit struct as a second generic parameter to [`Secret`] while defining it.
+/// Use the [`crate::strategy::Strategy`] trait to implement a masking strategy on a zero-variant
+/// enum and pass this enum as a second generic parameter to [`Secret`] while defining it.
 /// [`Secret`] will take care of applying the masking strategy on the inner secret when being
 /// displayed.
 ///
@@ -24,7 +24,7 @@ use crate::{strategy::Strategy, PeekInterface};
 /// use masking::Secret;
 /// use std::fmt;
 ///
-/// struct MyStrategy;
+/// enum MyStrategy {}
 ///
 /// impl<T> Strategy<T> for MyStrategy
 /// where
diff --git a/crates/masking/src/strategy.rs b/crates/masking/src/strategy.rs
index f744ee1f4b5..8b4d9b0ec34 100644
--- a/crates/masking/src/strategy.rs
+++ b/crates/masking/src/strategy.rs
@@ -7,7 +7,7 @@ pub trait Strategy<T> {
 }
 
 /// Debug with type
-pub struct WithType;
+pub enum WithType {}
 
 impl<T> Strategy<T> for WithType {
     fn fmt(_: &T, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
@@ -18,7 +18,7 @@ impl<T> Strategy<T> for WithType {
 }
 
 /// Debug without type
-pub struct WithoutType;
+pub enum WithoutType {}
 
 impl<T> Strategy<T> for WithoutType {
     fn fmt(_: &T, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {

as per #1973

## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [ ] New feature
- [x] Enhancement
- [x] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
Use empty enums as strategy type parameter, instead of unit structs, to prevent instantiation. 


### Additional Changes

no


## Motivation and Context
#1973

## How did you test it?

`cargo clippy --all-features`

Assuming existing tests should catch side effects if any. 

## Checklist
<!-- Put an `x` in the boxes that apply -->

- [x] I formatted the code `cargo +nightly fmt --all`
- [x] I addressed lints thrown by `cargo clippy`
- [x] I reviewed the submitted code
- [ ] I added unit tests for my changes where possible
- [ ] I added a [CHANGELOG](/CHANGELOG.md) entry if applicable
