use crate::calendar::AnyCalendarProvider;
use crate::external_loaders::*;
use crate::format::datetime::DateTimeWriteError;
use crate::format::datetime::{try_write_pattern, try_write_pattern_items};
use crate::format::neo::*;
use crate::input::ExtractedDateTimeInput;
use crate::input::{DateInput, DateTimeInput, IsoTimeInput};
use crate::neo_marker::{NeoFormatterMarker, TypedNeoFormatterMarker};
use crate::neo_pattern::DateTimePattern;
use crate::neo_skeleton::NeoSkeletonLength;
use crate::options::length;
use crate::provider::neo::*;
use crate::raw::neo::*;
use crate::CldrCalendar;
use core::fmt;
use core::marker::PhantomData;
use icu_calendar::provider::{
ChineseCacheV1Marker, DangiCacheV1Marker, IslamicObservationalCacheV1Marker,
IslamicUmmAlQuraCacheV1Marker, JapaneseErasV1Marker, JapaneseExtendedErasV1Marker,
WeekDataV2Marker,
};
use icu_calendar::{AnyCalendar, Iso};
use icu_decimal::provider::DecimalSymbolsV1Marker;
use icu_provider::prelude::*;
use writeable::TryWriteable;
#[doc(hidden)] pub mod _internal {
pub use crate::calendar::CalMarkers;
pub use crate::calendar::FullDataCalMarkers;
pub use crate::calendar::NoDataCalMarkers;
}
use _internal::CalMarkers;
use _internal::FullDataCalMarkers as FullData;
macro_rules! gen_any_buffer_constructors_with_external_loader {
($compiled_fn:ident, $any_fn:ident, $buffer_fn:ident, $internal_fn:ident, $($arg:ident: $ty:path),+) => {
#[doc = icu_provider::gen_any_buffer_unstable_docs!(ANY, Self::$compiled_fn)]
pub fn $any_fn<P>(
provider: &P,
locale: &DataLocale,
$($arg: $ty),+
) -> Result<Self, LoadError>
where
P: AnyProvider + ?Sized,
{
Self::$internal_fn(
&provider.as_downcasting(),
&ExternalLoaderAny(provider),
locale,
$($arg),+
)
}
#[doc = icu_provider::gen_any_buffer_unstable_docs!(BUFFER, Self::$compiled_fn)]
#[cfg(feature = "serde")]
pub fn $buffer_fn<P>(
provider: &P,
locale: &DataLocale,
$($arg: $ty),+
) -> Result<Self, LoadError>
where
P: BufferProvider + ?Sized,
{
Self::$internal_fn(
&provider.as_deserializing(),
&ExternalLoaderBuffer(provider),
locale,
$($arg),+
)
}
};
(S: $skel:path | $compts:path, $compiled_fn:ident, $any_fn:ident, $buffer_fn:ident, $internal_fn:ident, $($arg:ident: $ty:path),+) => {
#[doc = icu_provider::gen_any_buffer_unstable_docs!(ANY, Self::$compiled_fn)]
pub fn $any_fn<S, P>(
provider: &P,
locale: &DataLocale,
$($arg: $ty),+
) -> Result<Self, LoadError>
where
S: ?Sized + $skel + $compts,
P: AnyProvider + ?Sized,
{
Self::$internal_fn::<S, _, _>(
&provider.as_downcasting(),
&ExternalLoaderAny(provider),
locale,
$($arg),+
)
}
#[doc = icu_provider::gen_any_buffer_unstable_docs!(BUFFER, Self::$compiled_fn)]
#[cfg(feature = "serde")]
pub fn $buffer_fn<S, P>(
provider: &P,
locale: &DataLocale,
$($arg: $ty),+
) -> Result<Self, LoadError>
where
S: ?Sized + $skel + $compts,
P: BufferProvider + ?Sized,
{
Self::$internal_fn::<S, _, _>(
&provider.as_deserializing(),
&ExternalLoaderBuffer(provider),
locale,
$($arg),+
)
}
};
}
size_test!(
TypedNeoDateFormatter<icu_calendar::Gregorian>,
typed_neo_date_formatter_size,
456
);
#[doc = typed_neo_date_formatter_size!()]
#[derive(Debug)]
pub struct TypedNeoDateFormatter<C: CldrCalendar> {
selection: DatePatternSelectionData,
names: RawDateTimeNames<DateMarker>,
_calendar: PhantomData<C>,
}
impl<C: CldrCalendar> TypedNeoDateFormatter<C> {
#[cfg(feature = "compiled_data")]
pub fn try_new_with_length(locale: &DataLocale, length: length::Date) -> Result<Self, LoadError>
where
crate::provider::Baked: Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>,
{
Self::try_new_with_length_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new_with_length,
try_new_with_length_with_any_provider,
try_new_with_length_with_buffer_provider,
try_new_with_length_internal,
length: length::Date
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new_with_length)]
pub fn try_new_with_length_unstable<P>(
provider: &P,
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>
+ DataProvider<WeekdayNamesV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>
+ DataProvider<WeekDataV2Marker>,
{
Self::try_new_with_length_internal(
provider,
&ExternalLoaderUnstable(provider),
locale,
length,
)
}
fn try_new_with_length_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>
+ DataProvider<WeekdayNamesV1Marker>,
L: FixedDecimalFormatterLoader + WeekCalculatorLoader,
{
let selection = DatePatternSelectionData::try_new_with_length(
&C::DatePatternV1Marker::bind(provider),
locale,
length,
)
.map_err(LoadError::Data)?;
let mut names = RawDateTimeNames::new_without_fixed_decimal_formatter();
names.load_for_pattern(
&C::YearNamesV1Marker::bind(provider), &C::MonthNamesV1Marker::bind(provider), &WeekdayNamesV1Marker::bind(provider), &PhantomProvider, Some(loader), Some(loader), locale,
selection.pattern_items_for_data_loading(),
)?;
Ok(Self {
selection,
names,
_calendar: PhantomData,
})
}
pub fn format<T>(&self, date: &T) -> FormattedNeoDate
where
T: DateInput<Calendar = C>,
{
let datetime = ExtractedDateTimeInput::extract_from_date(date);
FormattedNeoDate {
pattern: self.selection.select(&datetime),
datetime,
names: self.names.as_borrowed(),
}
}
}
size_test!(TypedNeoFormatter<icu_calendar::Gregorian, crate::neo_marker::NeoYearMonthDayMarker>, typed_neo_year_month_day_formatter_size, 536);
#[doc = typed_neo_year_month_day_formatter_size!()]
#[derive(Debug)]
pub struct TypedNeoFormatter<C: CldrCalendar, R: TypedNeoFormatterMarker<C>> {
selection: DateTimePatternSelectionData,
names: RawDateTimeNames<R::DateTimeNamesMarker>,
_calendar: PhantomData<C>,
}
impl<C: CldrCalendar, R: TypedNeoFormatterMarker<C>> TypedNeoFormatter<C, R> {
#[cfg(feature = "compiled_data")]
pub fn try_new(locale: &DataLocale, length: NeoSkeletonLength) -> Result<Self, LoadError>
where
crate::provider::Baked: Sized
+ DataProvider<R::YearNamesV1Marker>
+ DataProvider<R::MonthNamesV1Marker>
+ DataProvider<R::DateSkeletonPatternsV1Marker>
+ DataProvider<R::WeekdayNamesV1Marker>
+ DataProvider<R::DayPeriodNamesV1Marker>
+ DataProvider<R::TimeSkeletonPatternsV1Marker>
+ DataProvider<R::DateTimePatternV1Marker>,
{
Self::try_new_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new,
try_new_with_any_provider,
try_new_with_buffer_provider,
try_new_internal,
length: NeoSkeletonLength
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new)]
pub fn try_new_with_length_unstable<P>(
provider: &P,
locale: &DataLocale,
length: NeoSkeletonLength,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<R::YearNamesV1Marker>
+ DataProvider<R::MonthNamesV1Marker>
+ DataProvider<R::DateSkeletonPatternsV1Marker>
+ DataProvider<R::WeekdayNamesV1Marker>
+ DataProvider<R::DayPeriodNamesV1Marker>
+ DataProvider<R::TimeSkeletonPatternsV1Marker>
+ DataProvider<R::DateTimePatternV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>
+ DataProvider<WeekDataV2Marker>,
{
Self::try_new_internal(provider, &ExternalLoaderUnstable(provider), locale, length)
}
fn try_new_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
length: NeoSkeletonLength,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<R::YearNamesV1Marker>
+ DataProvider<R::MonthNamesV1Marker>
+ DataProvider<R::DateSkeletonPatternsV1Marker>
+ DataProvider<R::WeekdayNamesV1Marker>
+ DataProvider<R::DayPeriodNamesV1Marker>
+ DataProvider<R::TimeSkeletonPatternsV1Marker>
+ DataProvider<R::DateTimePatternV1Marker>,
L: FixedDecimalFormatterLoader + WeekCalculatorLoader,
{
let selection = DateTimePatternSelectionData::try_new_with_skeleton(
&R::DateSkeletonPatternsV1Marker::bind(provider),
&R::TimeSkeletonPatternsV1Marker::bind(provider),
&R::DateTimePatternV1Marker::bind(provider),
locale,
length,
R::COMPONENTS,
)
.map_err(LoadError::Data)?;
let mut names = RawDateTimeNames::new_without_fixed_decimal_formatter();
names.load_for_pattern(
&R::YearNamesV1Marker::bind(provider), &R::MonthNamesV1Marker::bind(provider), &R::WeekdayNamesV1Marker::bind(provider), &R::DayPeriodNamesV1Marker::bind(provider), Some(loader), Some(loader), locale,
selection.pattern_items_for_data_loading(),
)?;
Ok(Self {
selection,
names,
_calendar: PhantomData,
})
}
pub fn format<T>(&self, date: &T) -> FormattedNeoDateTime
where
T: DateInput<Calendar = C>,
{
let datetime = ExtractedDateTimeInput::extract_from_date(date);
FormattedNeoDateTime {
pattern: self.selection.select(&datetime),
datetime,
names: self.names.as_borrowed(),
}
}
}
size_test!(
NeoFormatter<crate::neo_marker::NeoYearMonthDayMarker>,
neo_year_month_day_formatter_size,
592
);
#[doc = neo_year_month_day_formatter_size!()]
#[derive(Debug)]
pub struct NeoFormatter<R: NeoFormatterMarker> {
selection: DateTimePatternSelectionData,
names: RawDateTimeNames<R::DateTimeNamesMarker>,
calendar: AnyCalendar,
}
impl<R: NeoFormatterMarker> NeoFormatter<R> {
#[inline(never)]
#[cfg(feature = "compiled_data")]
pub fn try_new(locale: &DataLocale, length: NeoSkeletonLength) -> Result<Self, LoadError>
where
crate::provider::Baked: Sized
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Buddhist>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Chinese>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Coptic>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Dangi>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Ethiopian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Gregorian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Hebrew>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Indian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicCivil>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicObservational>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicTabular>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Japanese>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Persian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Roc>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Buddhist>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Chinese>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Coptic>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Dangi>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Ethiopian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Gregorian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Hebrew>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Indian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicCivil>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicObservational>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicTabular>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Japanese>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Persian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Roc>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Buddhist>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Chinese>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Coptic>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Dangi>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Ethiopian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Gregorian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Hebrew>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Indian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicCivil>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicObservational>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicTabular>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Japanese>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::JapaneseExtended>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Persian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Roc>
+ DataProvider<R::WeekdayNamesV1Marker>
+ DataProvider<R::DayPeriodNamesV1Marker>
+ DataProvider<R::TimeSkeletonPatternsV1Marker>
+ DataProvider<R::DateTimePatternV1Marker>,
{
Self::try_new_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new,
try_new_with_any_provider,
try_new_with_buffer_provider,
try_new_internal,
length: NeoSkeletonLength
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new)]
pub fn try_new_unstable<P>(
provider: &P,
locale: &DataLocale,
length: NeoSkeletonLength,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Buddhist>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Chinese>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Coptic>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Dangi>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Ethiopian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Gregorian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Hebrew>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Indian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicCivil>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicObservational>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicTabular>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Japanese>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Persian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Roc>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Buddhist>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Chinese>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Coptic>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Dangi>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Ethiopian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Gregorian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Hebrew>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Indian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicCivil>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicObservational>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicTabular>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Japanese>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Persian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Roc>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Buddhist>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Chinese>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Coptic>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Dangi>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Ethiopian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Gregorian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Hebrew>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Indian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicCivil>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicObservational>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicTabular>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Japanese>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::JapaneseExtended>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Persian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Roc>
+ DataProvider<R::WeekdayNamesV1Marker>
+ DataProvider<R::DayPeriodNamesV1Marker>
+ DataProvider<R::TimeSkeletonPatternsV1Marker>
+ DataProvider<R::DateTimePatternV1Marker>
+ DataProvider<ChineseCacheV1Marker>
+ DataProvider<DangiCacheV1Marker>
+ DataProvider<IslamicObservationalCacheV1Marker>
+ DataProvider<IslamicUmmAlQuraCacheV1Marker>
+ DataProvider<JapaneseErasV1Marker>
+ DataProvider<JapaneseExtendedErasV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>
+ DataProvider<WeekDataV2Marker>,
{
Self::try_new_internal(provider, &ExternalLoaderUnstable(provider), locale, length)
}
fn try_new_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
length: NeoSkeletonLength,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Buddhist>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Chinese>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Coptic>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Dangi>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Ethiopian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Gregorian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Hebrew>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Indian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicCivil>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicObservational>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicTabular>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Japanese>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Persian>
+ DataProvider<<R::Year as CalMarkers<YearNamesV1Marker>>::Roc>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Buddhist>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Chinese>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Coptic>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Dangi>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Ethiopian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Gregorian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Hebrew>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Indian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicCivil>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicObservational>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicTabular>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Japanese>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Persian>
+ DataProvider<<R::Month as CalMarkers<MonthNamesV1Marker>>::Roc>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Buddhist>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Chinese>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Coptic>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Dangi>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Ethiopian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Gregorian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Hebrew>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Indian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicCivil>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicObservational>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicTabular>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Japanese>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::JapaneseExtended>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Persian>
+ DataProvider<<R::Skel as CalMarkers<SkeletaV1Marker>>::Roc>
+ DataProvider<R::WeekdayNamesV1Marker>
+ DataProvider<R::DayPeriodNamesV1Marker>
+ DataProvider<R::TimeSkeletonPatternsV1Marker>
+ DataProvider<R::DateTimePatternV1Marker>,
L: FixedDecimalFormatterLoader + WeekCalculatorLoader + AnyCalendarLoader,
{
let calendar = AnyCalendarLoader::load(loader, locale).map_err(LoadError::Data)?;
let kind = calendar.kind();
let selection = DateTimePatternSelectionData::try_new_with_skeleton(
&AnyCalendarProvider::<R::Skel, _>::new(provider, kind),
&R::TimeSkeletonPatternsV1Marker::bind(provider),
&R::DateTimePatternV1Marker::bind(provider),
locale,
length,
R::COMPONENTS,
)
.map_err(LoadError::Data)?;
let mut names = RawDateTimeNames::new_without_fixed_decimal_formatter();
names.load_for_pattern(
&AnyCalendarProvider::<R::Year, _>::new(provider, kind), &AnyCalendarProvider::<R::Month, _>::new(provider, kind), &R::WeekdayNamesV1Marker::bind(provider), &R::DayPeriodNamesV1Marker::bind(provider), Some(loader), Some(loader), locale,
selection.pattern_items_for_data_loading(),
)?;
Ok(Self {
selection,
names,
calendar,
})
}
pub fn format<T>(
&self,
date: &T,
) -> Result<FormattedNeoDateTime, crate::MismatchedCalendarError>
where
T: DateInput<Calendar = AnyCalendar>,
{
let datetime =
if let Some(converted) = crate::calendar::convert_if_necessary(&self.calendar, date)? {
ExtractedDateTimeInput::extract_from_date(&converted)
} else {
ExtractedDateTimeInput::extract_from_date(date)
};
Ok(FormattedNeoDateTime {
pattern: self.selection.select(&datetime),
datetime,
names: self.names.as_borrowed(),
})
}
pub fn convert_and_format<T>(&self, datetime: &T) -> FormattedNeoDateTime
where
T: DateTimeInput<Calendar = Iso>,
{
let calendar = icu_calendar::Ref(&self.calendar);
let date = icu_calendar::Date::new_from_iso(datetime.to_iso(), calendar);
let time = icu_calendar::Time::new(
datetime.hour().unwrap_or_default(),
datetime.minute().unwrap_or_default(),
datetime.second().unwrap_or_default(),
datetime.nanosecond().unwrap_or_default(),
);
let datetime = icu_calendar::DateTime::new(date, time);
let datetime = ExtractedDateTimeInput::extract_from(&datetime);
FormattedNeoDateTime {
pattern: self.selection.select(&datetime),
datetime,
names: self.names.as_borrowed(),
}
}
}
size_test!(NeoDateFormatter, neo_date_formatter_size, 512);
#[doc = neo_date_formatter_size!()]
#[derive(Debug)]
pub struct NeoDateFormatter {
selection: DatePatternSelectionData,
names: RawDateTimeNames<DateMarker>,
calendar: AnyCalendar,
}
impl NeoDateFormatter {
#[inline(never)]
#[cfg(feature = "compiled_data")]
pub fn try_new_with_length(
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError> {
Self::try_new_with_length_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new_with_length,
try_new_with_length_with_any_provider,
try_new_with_length_with_buffer_provider,
try_new_with_length_internal,
length: length::Date
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new_with_length)]
pub fn try_new_with_length_unstable<P>(
provider: &P,
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Roc>
+ DataProvider<WeekdayNamesV1Marker>
+ DataProvider<ChineseCacheV1Marker>
+ DataProvider<DangiCacheV1Marker>
+ DataProvider<IslamicObservationalCacheV1Marker>
+ DataProvider<IslamicUmmAlQuraCacheV1Marker>
+ DataProvider<JapaneseErasV1Marker>
+ DataProvider<JapaneseExtendedErasV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>
+ DataProvider<WeekDataV2Marker>,
{
Self::try_new_with_length_internal(
provider,
&ExternalLoaderUnstable(provider),
locale,
length,
)
}
fn try_new_with_length_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Roc>
+ DataProvider<WeekdayNamesV1Marker>,
L: FixedDecimalFormatterLoader + WeekCalculatorLoader + AnyCalendarLoader,
{
let calendar = AnyCalendarLoader::load(loader, locale).map_err(LoadError::Data)?;
let kind = calendar.kind();
let selection = DatePatternSelectionData::try_new_with_length(
&AnyCalendarProvider::<FullData, _>::new(provider, kind),
locale,
length,
)
.map_err(LoadError::Data)?;
let mut names = RawDateTimeNames::new_without_fixed_decimal_formatter();
names.load_for_pattern(
&AnyCalendarProvider::<FullData, _>::new(provider, kind), &AnyCalendarProvider::<FullData, _>::new(provider, kind), &WeekdayNamesV1Marker::bind(provider), &PhantomProvider, Some(loader), Some(loader), locale,
selection.pattern_items_for_data_loading(),
)?;
Ok(Self {
selection,
names,
calendar,
})
}
pub fn format<T>(&self, date: &T) -> Result<FormattedNeoDate, crate::MismatchedCalendarError>
where
T: DateInput<Calendar = AnyCalendar>,
{
let datetime =
if let Some(converted) = crate::calendar::convert_if_necessary(&self.calendar, date)? {
ExtractedDateTimeInput::extract_from_date(&converted)
} else {
ExtractedDateTimeInput::extract_from_date(date)
};
Ok(FormattedNeoDate {
pattern: self.selection.select(&datetime),
datetime,
names: self.names.as_borrowed(),
})
}
}
#[derive(Debug)]
pub struct FormattedNeoDate<'a> {
pattern: DatePatternDataBorrowed<'a>,
datetime: ExtractedDateTimeInput,
names: RawDateTimeNamesBorrowed<'a>,
}
impl<'a> TryWriteable for FormattedNeoDate<'a> {
type Error = DateTimeWriteError;
fn try_write_to_parts<S: writeable::PartsWrite + ?Sized>(
&self,
sink: &mut S,
) -> Result<Result<(), Self::Error>, fmt::Error> {
try_write_pattern(
self.pattern.as_borrowed(),
&self.datetime,
Some(&self.names),
Some(&self.names),
self.names.week_calculator,
self.names.fixed_decimal_formatter,
sink,
)
}
}
impl<'a> FormattedNeoDate<'a> {
pub fn pattern(&self) -> DateTimePattern {
self.pattern.to_pattern()
}
}
size_test!(NeoTimeFormatter, neo_time_formatter_size, 312);
#[doc = neo_time_formatter_size!()]
#[derive(Debug)]
pub struct NeoTimeFormatter {
selection: TimePatternSelectionData,
names: RawDateTimeNames<TimeMarker>,
}
impl NeoTimeFormatter {
#[cfg(feature = "compiled_data")]
pub fn try_new_with_length(
locale: &DataLocale,
length: length::Time,
) -> Result<Self, LoadError> {
Self::try_new_with_length_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new_with_length,
try_new_with_length_with_any_provider,
try_new_with_length_with_buffer_provider,
try_new_with_length_internal,
length: length::Time
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new_with_length)]
pub fn try_new_with_length_unstable<P>(
provider: &P,
locale: &DataLocale,
length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>,
{
Self::try_new_with_length_internal(
provider,
&ExternalLoaderUnstable(provider),
locale,
length,
)
}
fn try_new_with_length_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>,
L: FixedDecimalFormatterLoader,
{
let selection = TimePatternSelectionData::try_new_with_length(provider, locale, length)
.map_err(LoadError::Data)?;
let mut names = RawDateTimeNames::new_without_fixed_decimal_formatter();
names.load_for_pattern(
&PhantomProvider, &PhantomProvider, &PhantomProvider, &DayPeriodNamesV1Marker::bind(provider), Some(loader), None::<&PhantomLoader>, locale,
selection.pattern_items_for_data_loading(),
)?;
Ok(Self { selection, names })
}
pub fn format<T>(&self, time: &T) -> FormattedNeoTime
where
T: IsoTimeInput,
{
let datetime = ExtractedDateTimeInput::extract_from_time(time);
FormattedNeoTime {
pattern: self.selection.select(&datetime),
datetime,
names: self.names.as_borrowed(),
}
}
}
#[derive(Debug)]
pub struct FormattedNeoTime<'a> {
pattern: TimePatternDataBorrowed<'a>,
datetime: ExtractedDateTimeInput,
names: RawDateTimeNamesBorrowed<'a>,
}
impl<'a> TryWriteable for FormattedNeoTime<'a> {
type Error = DateTimeWriteError;
fn try_write_to_parts<S: writeable::PartsWrite + ?Sized>(
&self,
sink: &mut S,
) -> Result<Result<(), Self::Error>, fmt::Error> {
try_write_pattern(
self.pattern.as_borrowed(),
&self.datetime,
Some(&self.names),
Some(&self.names),
self.names.week_calculator,
self.names.fixed_decimal_formatter,
sink,
)
}
}
impl<'a> FormattedNeoTime<'a> {
pub fn pattern(&self) -> DateTimePattern {
self.pattern.to_pattern()
}
}
size_test!(
TypedNeoDateTimeFormatter<icu_calendar::Gregorian>,
typed_neo_date_time_formatter_size,
576
);
#[doc = typed_neo_date_time_formatter_size!()]
#[derive(Debug)]
pub struct TypedNeoDateTimeFormatter<C: CldrCalendar> {
selection: DateTimePatternSelectionData,
names: RawDateTimeNames<DateTimeMarker>,
_calendar: PhantomData<C>,
}
impl<C: CldrCalendar> TypedNeoDateTimeFormatter<C> {
#[cfg(feature = "compiled_data")]
pub fn try_new_with_date_length(
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError>
where
crate::provider::Baked: Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>,
{
Self::try_new_with_date_length_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new_with_date_length,
try_new_with_date_length_with_any_provider,
try_new_with_date_length_with_buffer_provider,
try_new_with_date_length_internal,
length: length::Date
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new_with_date_length)]
pub fn try_new_with_date_length_unstable<P>(
provider: &P,
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>
+ DataProvider<WeekdayNamesV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>
+ DataProvider<WeekDataV2Marker>,
{
Self::try_new_with_date_length_internal(
provider,
&ExternalLoaderUnstable(provider),
locale,
length,
)
}
fn try_new_with_date_length_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>
+ DataProvider<WeekdayNamesV1Marker>,
L: FixedDecimalFormatterLoader + WeekCalculatorLoader,
{
let date_formatter = TypedNeoDateFormatter::<C>::try_new_with_length_internal(
provider, loader, locale, length,
)?;
Ok(Self {
selection: DateTimePatternSelectionData::Date(date_formatter.selection),
names: date_formatter.names.into(),
_calendar: PhantomData,
})
}
#[cfg(feature = "compiled_data")]
pub fn try_new_with_time_length(
locale: &DataLocale,
length: length::Time,
) -> Result<Self, LoadError> {
Self::try_new_with_time_length_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new_with_time_length,
try_new_with_time_length_with_any_provider,
try_new_with_time_length_with_buffer_provider,
try_new_with_time_length_internal,
length: length::Time
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new_with_time_length)]
pub fn try_new_with_time_length_unstable<P>(
provider: &P,
locale: &DataLocale,
length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>,
{
Self::try_new_with_time_length_internal(
provider,
&ExternalLoaderUnstable(provider),
locale,
length,
)
}
fn try_new_with_time_length_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>,
L: FixedDecimalFormatterLoader,
{
let time_formatter =
NeoTimeFormatter::try_new_with_length_internal(provider, loader, locale, length)?;
Ok(Self {
selection: DateTimePatternSelectionData::Time(time_formatter.selection),
names: time_formatter.names.into(),
_calendar: PhantomData,
})
}
#[cfg(feature = "compiled_data")]
pub fn try_new_with_lengths(
locale: &DataLocale,
date_length: length::Date,
time_length: length::Time,
) -> Result<Self, LoadError>
where
crate::provider::Baked: Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>,
{
Self::try_new_with_lengths_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
date_length,
time_length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new_with_lengths,
try_new_with_lengths_with_any_provider,
try_new_with_lengths_with_buffer_provider,
try_new_with_lengths_internal,
date_length: length::Date,
time_length: length::Time
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new_with_lengths)]
pub fn try_new_with_lengths_unstable<P>(
provider: &P,
locale: &DataLocale,
date_length: length::Date,
time_length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>
+ DataProvider<WeekdayNamesV1Marker>
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>
+ DataProvider<DateTimePatternV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>
+ DataProvider<WeekDataV2Marker>,
{
Self::try_new_with_lengths_internal(
provider,
&ExternalLoaderUnstable(provider),
locale,
date_length,
time_length,
)
}
fn try_new_with_lengths_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
date_length: length::Date,
time_length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>
+ DataProvider<WeekdayNamesV1Marker>
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>
+ DataProvider<DateTimePatternV1Marker>,
L: FixedDecimalFormatterLoader + WeekCalculatorLoader,
{
let selection = DateTimeGluePatternSelectionData::try_new_with_lengths(
&C::DatePatternV1Marker::bind(provider),
provider,
locale,
date_length,
time_length,
)
.map_err(LoadError::Data)?;
let mut names = RawDateTimeNames::new_without_fixed_decimal_formatter();
names.load_for_pattern(
&C::YearNamesV1Marker::bind(provider), &C::MonthNamesV1Marker::bind(provider), &WeekdayNamesV1Marker::bind(provider), &DayPeriodNamesV1Marker::bind(provider), Some(loader), Some(loader), locale,
selection.pattern_items_for_data_loading(),
)?;
Ok(Self {
selection: DateTimePatternSelectionData::DateTimeGlue(selection),
names,
_calendar: PhantomData,
})
}
#[cfg(all(feature = "compiled_data", feature = "experimental"))]
pub fn try_new(
locale: &DataLocale,
options: crate::DateTimeFormatterOptions,
) -> Result<Self, LoadError>
where
crate::provider::Baked: Sized
+ DataProvider<C::DatePatternV1Marker>
+ DataProvider<C::YearNamesV1Marker>
+ DataProvider<C::MonthNamesV1Marker>,
{
use crate::DateTimeFormatterOptions;
match options {
DateTimeFormatterOptions::Length(length::Bag {
date: Some(date),
time: Some(time),
}) => Self::try_new_with_lengths(locale, date, time),
DateTimeFormatterOptions::Length(length::Bag {
date: Some(date),
time: None,
}) => Self::try_new_with_date_length(locale, date),
DateTimeFormatterOptions::Length(length::Bag {
date: None,
time: Some(time),
}) => Self::try_new_with_time_length(locale, time),
_ => todo!(), }
}
pub fn format<T>(&self, datetime: &T) -> FormattedNeoDateTime
where
T: DateTimeInput<Calendar = C>,
{
let datetime = ExtractedDateTimeInput::extract_from(datetime);
FormattedNeoDateTime {
pattern: self.selection.select(&datetime),
datetime,
names: self.names.as_borrowed(),
}
}
}
size_test!(NeoDateTimeFormatter, neo_date_time_formatter_size, 632);
#[doc = neo_date_time_formatter_size!()]
#[derive(Debug)]
pub struct NeoDateTimeFormatter {
selection: DateTimePatternSelectionData,
names: RawDateTimeNames<DateTimeMarker>,
calendar: AnyCalendar,
}
impl NeoDateTimeFormatter {
#[inline(never)]
#[cfg(feature = "compiled_data")]
pub fn try_new_with_date_length(
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError> {
Self::try_new_with_date_length_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new_with_date_length,
try_new_with_date_length_with_any_provider,
try_new_with_date_length_with_buffer_provider,
try_new_with_date_length_internal,
length: length::Date
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new_with_date_length)]
pub fn try_new_with_date_length_unstable<P>(
provider: &P,
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Roc>
+ DataProvider<WeekdayNamesV1Marker>
+ DataProvider<ChineseCacheV1Marker>
+ DataProvider<DangiCacheV1Marker>
+ DataProvider<IslamicObservationalCacheV1Marker>
+ DataProvider<IslamicUmmAlQuraCacheV1Marker>
+ DataProvider<JapaneseErasV1Marker>
+ DataProvider<JapaneseExtendedErasV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>
+ DataProvider<WeekDataV2Marker>,
{
Self::try_new_with_date_length_internal(
provider,
&ExternalLoaderUnstable(provider),
locale,
length,
)
}
fn try_new_with_date_length_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
length: length::Date,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Roc>
+ DataProvider<WeekdayNamesV1Marker>,
L: FixedDecimalFormatterLoader + WeekCalculatorLoader + AnyCalendarLoader,
{
let date_formatter =
NeoDateFormatter::try_new_with_length_internal(provider, loader, locale, length)?;
Ok(Self {
selection: DateTimePatternSelectionData::Date(date_formatter.selection),
names: date_formatter.names.into(),
calendar: date_formatter.calendar,
})
}
#[inline(never)]
#[cfg(feature = "compiled_data")]
pub fn try_new_with_time_length(
locale: &DataLocale,
length: length::Time,
) -> Result<Self, LoadError> {
Self::try_new_with_time_length_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new_with_time_length,
try_new_with_time_length_with_any_provider,
try_new_with_time_length_with_buffer_provider,
try_new_with_time_length_internal,
length: length::Time
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new_with_time_length)]
pub fn try_new_with_time_length_unstable<P>(
provider: &P,
locale: &DataLocale,
length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>
+ DataProvider<ChineseCacheV1Marker>
+ DataProvider<DangiCacheV1Marker>
+ DataProvider<IslamicObservationalCacheV1Marker>
+ DataProvider<IslamicUmmAlQuraCacheV1Marker>
+ DataProvider<JapaneseErasV1Marker>
+ DataProvider<JapaneseExtendedErasV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>,
{
Self::try_new_with_time_length_internal(
provider,
&ExternalLoaderUnstable(provider),
locale,
length,
)
}
fn try_new_with_time_length_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>,
L: FixedDecimalFormatterLoader + AnyCalendarLoader,
{
let calendar = AnyCalendarLoader::load(loader, locale).map_err(LoadError::Data)?;
let time_formatter =
NeoTimeFormatter::try_new_with_length_internal(provider, loader, locale, length)?;
Ok(Self {
selection: DateTimePatternSelectionData::Time(time_formatter.selection),
names: time_formatter.names.into(),
calendar,
})
}
#[cfg(feature = "compiled_data")]
pub fn try_new_with_lengths(
locale: &DataLocale,
date_length: length::Date,
time_length: length::Time,
) -> Result<Self, LoadError> {
Self::try_new_with_lengths_internal(
&crate::provider::Baked,
&ExternalLoaderCompiledData,
locale,
date_length,
time_length,
)
}
gen_any_buffer_constructors_with_external_loader!(
try_new_with_lengths,
try_new_with_lengths_with_any_provider,
try_new_with_lengths_with_buffer_provider,
try_new_with_lengths_internal,
date_length: length::Date,
time_length: length::Time
);
#[doc = icu_provider::gen_any_buffer_unstable_docs!(UNSTABLE, Self::try_new_with_lengths)]
pub fn try_new_with_lengths_unstable<P>(
provider: &P,
locale: &DataLocale,
date_length: length::Date,
time_length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Roc>
+ DataProvider<WeekdayNamesV1Marker>
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>
+ DataProvider<DateTimePatternV1Marker>
+ DataProvider<ChineseCacheV1Marker>
+ DataProvider<DangiCacheV1Marker>
+ DataProvider<IslamicObservationalCacheV1Marker>
+ DataProvider<IslamicUmmAlQuraCacheV1Marker>
+ DataProvider<JapaneseErasV1Marker>
+ DataProvider<JapaneseExtendedErasV1Marker>
+ DataProvider<DecimalSymbolsV1Marker>
+ DataProvider<WeekDataV2Marker>,
{
Self::try_new_with_lengths_internal(
provider,
&ExternalLoaderUnstable(provider),
locale,
date_length,
time_length,
)
}
fn try_new_with_lengths_internal<P, L>(
provider: &P,
loader: &L,
locale: &DataLocale,
date_length: length::Date,
time_length: length::Time,
) -> Result<Self, LoadError>
where
P: ?Sized
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<YearNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<MonthNamesV1Marker>>::Roc>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Buddhist>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Chinese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Coptic>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Dangi>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Ethiopian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::EthiopianAmeteAlem>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Gregorian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Hebrew>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Indian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicCivil>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicObservational>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicTabular>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::IslamicUmmAlQura>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Japanese>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::JapaneseExtended>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Persian>
+ DataProvider<<FullData as CalMarkers<DatePatternV1Marker>>::Roc>
+ DataProvider<WeekdayNamesV1Marker>
+ DataProvider<TimePatternV1Marker>
+ DataProvider<DayPeriodNamesV1Marker>
+ DataProvider<DateTimePatternV1Marker>,
L: FixedDecimalFormatterLoader + WeekCalculatorLoader + AnyCalendarLoader,
{
let calendar = AnyCalendarLoader::load(loader, locale).map_err(LoadError::Data)?;
let kind = calendar.kind();
let selection = DateTimeGluePatternSelectionData::try_new_with_lengths(
&AnyCalendarProvider::<FullData, _>::new(provider, kind),
provider,
locale,
date_length,
time_length,
)
.map_err(LoadError::Data)?;
let mut names = RawDateTimeNames::new_without_fixed_decimal_formatter();
names.load_for_pattern(
&AnyCalendarProvider::<FullData, _>::new(provider, kind), &AnyCalendarProvider::<FullData, _>::new(provider, kind), &WeekdayNamesV1Marker::bind(provider), &DayPeriodNamesV1Marker::bind(provider), Some(loader), Some(loader), locale,
selection.pattern_items_for_data_loading(),
)?;
Ok(Self {
selection: DateTimePatternSelectionData::DateTimeGlue(selection),
names,
calendar,
})
}
pub fn format<T>(
&self,
datetime: &T,
) -> Result<FormattedNeoDateTime, crate::MismatchedCalendarError>
where
T: DateTimeInput<Calendar = AnyCalendar>,
{
let datetime = if let Some(converted) =
crate::calendar::convert_datetime_if_necessary(&self.calendar, datetime)?
{
ExtractedDateTimeInput::extract_from(&converted)
} else {
ExtractedDateTimeInput::extract_from(datetime)
};
Ok(FormattedNeoDateTime {
pattern: self.selection.select(&datetime),
datetime,
names: self.names.as_borrowed(),
})
}
}
#[derive(Debug)]
pub struct FormattedNeoDateTime<'a> {
pattern: DateTimePatternDataBorrowed<'a>,
datetime: ExtractedDateTimeInput,
names: RawDateTimeNamesBorrowed<'a>,
}
impl<'a> TryWriteable for FormattedNeoDateTime<'a> {
type Error = DateTimeWriteError;
fn try_write_to_parts<S: writeable::PartsWrite + ?Sized>(
&self,
sink: &mut S,
) -> Result<Result<(), Self::Error>, fmt::Error> {
try_write_pattern_items(
self.pattern.metadata(),
self.pattern.iter_items(),
&self.datetime,
Some(&self.names),
Some(&self.names),
self.names.week_calculator,
self.names.fixed_decimal_formatter,
sink,
)
}
}
impl<'a> FormattedNeoDateTime<'a> {
pub fn pattern(&self) -> DateTimePattern {
self.pattern.to_pattern()
}
}