use phonenumber::{parse, Mode, PhoneNumber as RawPhoneNumber};
use schemars::{gen::SchemaGenerator, schema::{Schema, SchemaObject}, JsonSchema};
use serde::{Deserialize, Serialize};
use std::ops::Deref;
use serde_with::{serde_as, skip_serializing_none, NoneAsEmptyString};
use chrono::{DateTime, Utc};
use validator::Validate;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct PhoneNumber(RawPhoneNumber);
impl Deref for PhoneNumber {
type Target = RawPhoneNumber;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl JsonSchema for PhoneNumber {
fn schema_name() -> String {
"PhoneNumber".to_string()
}
fn json_schema(_gen: &mut SchemaGenerator) -> Schema {
let schema_object = SchemaObject {
instance_type: Some(schemars::schema::InstanceType::String.into()),
format: Some("phone".to_string()),
..Default::default()
};
Schema::Object(schema_object)
}
}
impl From<RawPhoneNumber> for PhoneNumber {
fn from(phone_number: RawPhoneNumber) -> Self {
PhoneNumber(phone_number)
}
}
pub fn serialize_phone_number<S>(number: &PhoneNumber, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let e164 = number.format().mode(Mode::E164).to_string();
serializer.serialize_str(&e164)
}