Issue:
[FEATURE] Implement a masking strategy for UPI VPAs

### Feature Description

Unified Payments Interface (UPI) is a popular payment technique in India, used to transfer money among individuals, bill payments and merchant payments. In the case of money transfer among individuals, users are identified with a Virtual Payment Address (VPA). A VPA is typically of the following format: `<identifier>@<bank_name>`. (Feel free to read up more about UPI if you aren't already familiar with it.)

Since a VPA can uniquely identify a user, we'd want to mask VPAs in our application. However, we'd want to keep the `<bank_name>` part unmasked, since it could help us build analytics on the banks or payment service providers used, and possibly improve our routing experience.

### Possible Implementation

We'd want you to implement `masking::Strategy` for UPI VPAs (which could be called `UpiVpaMaskingStrategy`) which masks the identifier completely, and keeps the bank name part in clear text. You can refer to the email masking strategy to get an idea of how this can be done. Please include unit tests for the same.

https://github.com/juspay/hyperswitch/blob/2f9c28938f95a58532604817b1ed370ef8285dd8/crates/common_utils/src/pii.rs#L190-L205

Also, update the type of `vpa_id` field in `api_models::payments::UpiData` to be `Option<Secret<String, UpiVpaMaskingStrategy>>` instead.

https://github.com/juspay/hyperswitch/blob/2f9c28938f95a58532604817b1ed370ef8285dd8/crates/api_models/src/payments.rs#L783-L786

Resolution:
<think>
PR Context:
- Title: feat(pii): implement a masking strategy for UPI VPAs
- Merged: 2023-08-01T13:32:55Z
- Files changed: 6 files
- Commits: 10 commits

Implementation approach:
## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [x] New feature
- [ ] Enhancement
- [ ] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
<!-- Describe your changes in detail -->
Here, I have implemented masking::Strategy for UPI VPAs which is called UpiVpaMaskingStrategy which masks the identifier completely, and keeps the bank name part in clear text. I have included tests for the same. 

### Additional Changes


</think>

To implement this, you'll need to modify:


**Detailed Implementation:**


**Commit 1:** feat(pii): implement a masking strategy for UPI VPAs (#1641)
Co-authored-by: Prasunna Soppa <prasunn
Files to modify:


**crates/api_models/src/payments.rs**
  Modify existing code

**crates/common_utils/src/pii.rs**
  Add:
    - function: private::fmt
    - function: private::test_valid_upi_vpa_masking
    - function: private::test_invalid_upi_vpa_masking
    - struct: pub::UpiVpaMaskingStrategy
    - impl: impl Strategy<T> for UpiVpaMaskingStrategy

**crates/masking/src/abs.rs**
  Add:
    - function: private::switch_strategy
    - trait: pub::SwitchStrategy
    - impl: impl SwitchStrategy<FromStrategy, ToStrategy> for Secret<S, FromStrategy>

**crates/masking/src/lib.rs**
  Modify existing code

**crates/router/src/compatibility/stripe/payment_intents/types.rs**
  Modify existing code

**crates/router/src/connector/iatapay/transformers.rs**
  Modify existing code