#![allow(deprecated)]
use crate::error::TimeZoneError;
use crate::provider::names::*;
use crate::TimeZoneBcp47Id;
use icu_provider::prelude::*;
#[derive(Debug)]
#[deprecated(since = "1.5.0", note = "use `TimeZoneIdMapper` instead")]
pub struct IanaToBcp47Mapper {
data: DataPayload<IanaToBcp47MapV1Marker>,
}
#[cfg(feature = "compiled_data")]
impl Default for IanaToBcp47Mapper {
fn default() -> Self {
Self::new()
}
}
impl IanaToBcp47Mapper {
#[cfg(feature = "compiled_data")]
#[inline]
pub const fn new() -> Self {
IanaToBcp47Mapper {
data: DataPayload::from_static_ref(
crate::provider::Baked::SINGLETON_TIME_ZONE_IANA_TO_BCP47_V1,
),
}
}
icu_provider::gen_any_buffer_data_constructors!(locale: skip, options: skip, error: TimeZoneError,
#[cfg(skip)]
functions: [
new,
try_new_with_any_provider,
try_new_with_buffer_provider,
try_new_unstable,
Self,
]
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::new)]
pub fn try_new_unstable<P>(provider: &P) -> Result<Self, TimeZoneError>
where
P: DataProvider<IanaToBcp47MapV1Marker> + ?Sized,
{
let data = provider.load(Default::default())?.take_payload()?;
Ok(Self { data })
}
pub fn as_borrowed(&self) -> IanaToBcp47MapperBorrowed {
IanaToBcp47MapperBorrowed {
data: self.data.get(),
}
}
}
#[derive(Debug)]
#[deprecated(since = "1.5.0", note = "use `TimeZoneIdMapper` instead")]
pub struct IanaToBcp47MapperBorrowed<'a> {
data: &'a IanaToBcp47MapV1<'a>,
}
impl<'a> IanaToBcp47MapperBorrowed<'a> {
pub fn get(&self, iana_id: &str) -> Option<TimeZoneBcp47Id> {
self.get_bytes(iana_id.as_bytes())
}
pub fn get_bytes(&self, iana_id: &[u8]) -> Option<TimeZoneBcp47Id> {
let name_for_lookup = match tinystr::TinyAsciiStr::<48>::from_bytes(iana_id) {
Ok(tinystr) => tinystr.to_ascii_lowercase(),
Err(tinystr::TinyStrError::TooLarge { .. }) => {
debug_assert!(false, "IANA string too long for lookup");
return None;
}
Err(_) => {
return None;
}
};
let idx = self.data.map.get(name_for_lookup.as_bytes())?;
self.data.bcp47_ids.get(idx)
}
}
#[derive(Debug)]
#[deprecated(since = "1.5.0", note = "use `TimeZoneIdMapper` instead")]
pub struct IanaBcp47RoundTripMapper {
data1: DataPayload<IanaToBcp47MapV1Marker>,
data2: DataPayload<Bcp47ToIanaMapV1Marker>,
}
#[cfg(feature = "compiled_data")]
impl Default for IanaBcp47RoundTripMapper {
fn default() -> Self {
Self::new()
}
}
impl IanaBcp47RoundTripMapper {
#[cfg(feature = "compiled_data")]
#[inline]
pub const fn new() -> Self {
const _: () = assert!(
crate::provider::Baked::SINGLETON_TIME_ZONE_IANA_TO_BCP47_V1.bcp47_ids_checksum
== crate::provider::Baked::SINGLETON_TIME_ZONE_BCP47_TO_IANA_V1.bcp47_ids_checksum,
);
IanaBcp47RoundTripMapper {
data1: DataPayload::from_static_ref(
crate::provider::Baked::SINGLETON_TIME_ZONE_IANA_TO_BCP47_V1,
),
data2: DataPayload::from_static_ref(
crate::provider::Baked::SINGLETON_TIME_ZONE_BCP47_TO_IANA_V1,
),
}
}
icu_provider::gen_any_buffer_data_constructors!(locale: skip, options: skip, error: TimeZoneError,
#[cfg(skip)]
functions: [
new,
try_new_with_any_provider,
try_new_with_buffer_provider,
try_new_unstable,
Self,
]
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::new)]
pub fn try_new_unstable<P>(provider: &P) -> Result<Self, TimeZoneError>
where
P: DataProvider<IanaToBcp47MapV1Marker> + DataProvider<Bcp47ToIanaMapV1Marker> + ?Sized,
{
let data1 = provider.load(Default::default())?.take_payload()?;
let data2 = provider.load(Default::default())?.take_payload()?;
let obj = Self { data1, data2 };
if obj.data1.get().bcp47_ids_checksum != obj.data2.get().bcp47_ids_checksum {
return Err(TimeZoneError::MismatchedChecksums);
}
Ok(obj)
}
pub fn as_borrowed(&self) -> IanaBcp47RoundTripMapperBorrowed {
IanaBcp47RoundTripMapperBorrowed {
data1: self.data1.get(),
data2: self.data2.get(),
}
}
}
#[derive(Debug)]
#[deprecated(since = "1.5.0", note = "use `TimeZoneIdMapper` instead")]
pub struct IanaBcp47RoundTripMapperBorrowed<'a> {
data1: &'a IanaToBcp47MapV1<'a>,
data2: &'a Bcp47ToIanaMapV1<'a>,
}
impl<'a> IanaBcp47RoundTripMapperBorrowed<'a> {
pub fn iana_to_bcp47(&self, iana_id: &str) -> Option<TimeZoneBcp47Id> {
IanaToBcp47MapperBorrowed { data: self.data1 }.get(iana_id)
}
pub fn bcp47_to_iana(&self, bcp47_id: TimeZoneBcp47Id) -> Option<&str> {
let index = self.data1.bcp47_ids.binary_search(&bcp47_id).ok()?;
self.data2.canonical_iana_ids.get(index)
}
}