Issue:
[FEATURE]: add support for three letter and numeric country codes

### Feature Description

We are currently using two_letter country codes internally since majority of connectors accept only two_letter codes, there may arise a situation where some connector will accept only three_letter country codes or numeric codes. There is a complete list of the mapping https://www.nationsonline.org/oneworld/country_code_list.htm. 

### Possible Implementation

We can have an enum `Country` which will be the actual country name and then provide mapping to two_letter, three_letter codes and even numeric_codes. All the variants map to same enum `Country`. This can be achieved by implementing a custom serializer and deserializer as shown above.

```rust
#[derive(Clone, Copy, Debug)]
pub enum Country {
    Afghanistan,
    Albania,
    // ...
}

#[derive(Clone, Copy, Debug)]
pub enum Alpha2CountryCode {
    AF,
    AL,
    // ...
}

impl Country {
    // Note the `const`. Similar implementation for `to_alpha2(&self)`.
    pub const fn from_alpha2(code: Alpha2CountryCode) -> Self {
        match code {
            Alpha2CountryCode::AF => Self::Afghanistan,
            Alpha2CountryCode::AL => Self::Albania,
            // ...
        }
    }
}

mod custom_serde {
    use super::*;

    pub mod alpha2_country_code {
        use super::*;

        pub fn serialize<S>(code: &Country, serializer: S) -> Result<S::Ok, S::Error>
        where
            S: serde::Serializer,
        {
            // Serialize country as Alpha-2 code
            Err(serde::ser::Error::custom("not implemented"))
        }

        pub fn deserialize<'a, D>(deserializer: D) -> Result<Country, D::Error>
        where
            D: serde::Deserializer<'a>,
        {   
            // Deserialize Alpha-2 code from string, then convert to country enum
            Err(serde::de::Error::custom("not implemented"))
        }
    }
}

#[derive(serde::Deserialize, serde::Serialize)]
struct Address {
    #[serde(with = "custom_serde::alpha2_country_code")]
    country: Country,
}
```


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

- [X] I checked and didn't find 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

Resolution:
<think>
PR Context:
- Title: feat: allow (de)serializing countries to/from alpha-2, alpha-3 and numeric country codes
- Merged: 2023-04-06T13:58:01Z
- Files changed: 4 files
- Commits: 19 commits

Implementation approach:
## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [x] New feature
- [x] Enhancement
- [x] Refactoring
- [x] Dependency updates

## Description
fixes #804 


### Additional Changes

- [ ] This PR modifies the database schema
- [ ] This PR modifies application configuration/environment variables

<!-- 
Provide links to the files with corresponding changes.

Following are the paths where you can find config files:
1. `config`
2. `crates/router/src/
</think>

To implement this, you'll need to modify:


**Detailed Implementation:**


**Commit 1:** feat: allow (de)serializing countries to/from alpha-2, alpha-3 and numeric country codes (#836)
Co-a
Files to modify:


**crates/common_enums/src/enums.rs**
  Add:
    - function: private::fmt
    - function: pub::from_alpha2
    - function: pub::to_alpha2
    - function: pub::from_alpha3
    - function: pub::to_alpha3
    - function: pub::from_numeric
    - function: pub::to_numeric
    - function: pub::serialize
    - function: private::expecting
    - function: pub::deserialize
    - function: pub::serialize
    - function: private::expecting
    - function: pub::deserialize
    - function: pub::serialize
    - function: private::expecting
    - function: pub::deserialize
    - function: private::test_serialize_alpha2
    - function: private::test_serialize_alpha3
    - function: private::test_serialize_numeric
    - function: private::test_deserialize_alpha2
    - function: private::test_deserialize_alpha3
    - function: private::test_deserialize_numeric
    - function: private::test_deserialize_and_serialize
    - function: private::test_serialize_and_deserialize
    - function: private::test_deserialize_invalid_country_code
    - struct: pub::NumericCountryCodeParseError
    - struct: private::FieldVisitor
    - struct: private::FieldVisitor
    - struct: private::FieldVisitor
    - struct: private::Alpha2Request
    - struct: private::Alpha3Request
    - struct: private::NumericRequest
    - struct: private::HyperswitchRequestAlpha2
    - struct: private::HyperswitchRequestAlpha3
    - struct: private::HyperswitchRequestNumeric
    - enum: pub::CountryAlpha2
    - enum: pub::CountryAlpha3
    - enum: pub::Country
    - impl: impl Display for NumericCountryCodeParseError
    - impl: impl Country
    - impl: impl Visitor<'de> for FieldVisitor
    - impl: impl Visitor<'de> for FieldVisitor
    - impl: impl Visitor<'de> for FieldVisitor
    - mod: private::custom_serde
    - mod: pub::alpha2_country_code
    - mod: pub::alpha3_country_code
    - mod: pub::numeric_country_code
    - mod: private::tests