iso3166 1.2.1

ISO 3166 country data
Documentation
use crate::Country;

use serde::de::{Error, Visitor};
use serde::{Deserialize, Deserializer, Serialize, Serializer};

use core::fmt;

impl Serialize for Country {
    #[inline(always)]
    fn serialize<S: Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> {
        ser.serialize_str(self.0.alpha3)
    }
}

impl<'a> Deserialize<'a> for Country {
    fn deserialize<D: Deserializer<'a>>(des: D) -> Result<Self, D::Error> {
        des.deserialize_str(CountryVisitor)
    }
}

struct CountryVisitor;

impl<'a> Visitor<'a> for CountryVisitor {
    type Value = Country;

    #[inline]
    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        formatter.write_str("Expected 2 or 3 digit ISO-3166 country code")
    }

    #[inline]
    fn visit_str<E: Error>(self, input: &str) -> Result<Self::Value, E> {
        if input.len() == 2 {
            match Country::from_alpha2_ignore_case(input) {
                Some(country) => Ok(country),
                None => Err(Error::invalid_value(serde::de::Unexpected::Str(input), &self))
            }
        } else if input.len() == 3 {
            match Country::from_alpha3_ignore_case(input) {
                Some(country) => Ok(country),
                None => Err(Error::invalid_value(serde::de::Unexpected::Str(input), &self))
            }
        } else {
            Err(Error::invalid_value(serde::de::Unexpected::Str(input), &self))
        }
    }
}