use crate::{
metadata::{Descriptor, Format},
phone_number::Type,
};
use regex_cache::CachedRegex;
#[derive(Clone, Debug)]
pub struct Metadata {
pub(crate) descriptors: Descriptors,
pub(crate) id: String,
pub(crate) country_code: u16,
pub(crate) international_prefix: Option<CachedRegex>,
pub(crate) preferred_international_prefix: Option<String>,
pub(crate) national_prefix: Option<String>,
pub(crate) preferred_extension_prefix: Option<String>,
pub(crate) national_prefix_for_parsing: Option<CachedRegex>,
pub(crate) national_prefix_transform_rule: Option<String>,
pub(crate) formats: Vec<Format>,
pub(crate) international_formats: Vec<Format>,
pub(crate) main_country_for_code: bool,
pub(crate) leading_digits: Option<CachedRegex>,
pub(crate) mobile_number_portable: bool,
}
#[derive(Clone, Debug)]
pub struct Descriptors {
pub(crate) general: Descriptor,
pub(crate) fixed_line: Option<Descriptor>,
pub(crate) mobile: Option<Descriptor>,
pub(crate) toll_free: Option<Descriptor>,
pub(crate) premium_rate: Option<Descriptor>,
pub(crate) shared_cost: Option<Descriptor>,
pub(crate) personal_number: Option<Descriptor>,
pub(crate) voip: Option<Descriptor>,
pub(crate) pager: Option<Descriptor>,
pub(crate) uan: Option<Descriptor>,
pub(crate) emergency: Option<Descriptor>,
pub(crate) voicemail: Option<Descriptor>,
pub(crate) short_code: Option<Descriptor>,
pub(crate) standard_rate: Option<Descriptor>,
pub(crate) carrier: Option<Descriptor>,
pub(crate) no_international: Option<Descriptor>,
}
impl Metadata {
pub fn descriptors(&self) -> &Descriptors {
&self.descriptors
}
pub fn id(&self) -> &str {
&self.id
}
pub fn country_code(&self) -> u16 {
self.country_code
}
pub fn international_prefix(&self) -> Option<&CachedRegex> {
self.international_prefix.as_ref()
}
pub fn preferred_international_prefix(&self) -> Option<&str> {
self.preferred_international_prefix
.as_ref()
.map(AsRef::as_ref)
}
pub fn national_prefix(&self) -> Option<&str> {
self.national_prefix.as_ref().map(AsRef::as_ref)
}
pub fn preferred_extension_prefix(&self) -> Option<&str> {
self.preferred_extension_prefix.as_ref().map(AsRef::as_ref)
}
pub fn national_prefix_for_parsing(&self) -> Option<&CachedRegex> {
self.national_prefix_for_parsing.as_ref()
}
pub fn national_prefix_transform_rule(&self) -> Option<&str> {
self.national_prefix_transform_rule
.as_ref()
.map(AsRef::as_ref)
}
pub fn formats(&self) -> &[Format] {
&self.formats
}
pub fn international_formats(&self) -> &[Format] {
&self.international_formats
}
pub fn is_main_country_for_code(&self) -> bool {
self.main_country_for_code
}
pub fn leading_digits(&self) -> Option<&CachedRegex> {
self.leading_digits.as_ref()
}
pub fn is_mobile_number_portable(&self) -> bool {
self.mobile_number_portable
}
}
impl Descriptors {
pub fn get(&self, kind: Type) -> Option<&Descriptor> {
match kind {
Type::Unknown => Some(&self.general),
Type::FixedLine | Type::FixedLineOrMobile => self.fixed_line.as_ref(),
Type::Mobile => self.mobile.as_ref(),
Type::TollFree => self.toll_free.as_ref(),
Type::PremiumRate => self.premium_rate.as_ref(),
Type::SharedCost => self.shared_cost.as_ref(),
Type::PersonalNumber => self.personal_number.as_ref(),
Type::Voip => self.voip.as_ref(),
Type::Pager => self.pager.as_ref(),
Type::Uan => self.uan.as_ref(),
Type::Emergency => self.emergency.as_ref(),
Type::Voicemail => self.voicemail.as_ref(),
Type::ShortCode => self.short_code.as_ref(),
Type::StandardRate => self.standard_rate.as_ref(),
Type::Carrier => self.carrier.as_ref(),
Type::NoInternational => self.no_international.as_ref(),
}
}
pub fn general(&self) -> &Descriptor {
&self.general
}
pub fn fixed_line(&self) -> Option<&Descriptor> {
self.fixed_line.as_ref()
}
pub fn mobile(&self) -> Option<&Descriptor> {
self.mobile.as_ref()
}
pub fn toll_free(&self) -> Option<&Descriptor> {
self.toll_free.as_ref()
}
pub fn premium_rate(&self) -> Option<&Descriptor> {
self.premium_rate.as_ref()
}
pub fn shared_cost(&self) -> Option<&Descriptor> {
self.shared_cost.as_ref()
}
pub fn personal_number(&self) -> Option<&Descriptor> {
self.personal_number.as_ref()
}
pub fn voip(&self) -> Option<&Descriptor> {
self.voip.as_ref()
}
pub fn pager(&self) -> Option<&Descriptor> {
self.pager.as_ref()
}
pub fn uan(&self) -> Option<&Descriptor> {
self.uan.as_ref()
}
pub fn emergency(&self) -> Option<&Descriptor> {
self.emergency.as_ref()
}
pub fn voicemail(&self) -> Option<&Descriptor> {
self.voicemail.as_ref()
}
pub fn short_code(&self) -> Option<&Descriptor> {
self.short_code.as_ref()
}
pub fn standard_rate(&self) -> Option<&Descriptor> {
self.standard_rate.as_ref()
}
pub fn carrier(&self) -> Option<&Descriptor> {
self.carrier.as_ref()
}
pub fn no_international(&self) -> Option<&Descriptor> {
self.no_international.as_ref()
}
}