// This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use icu_datetime::options::SubsecondDigits; #[diplomat::bridge] #[diplomat::abi_rename = "icu4x_{0}_mv1"] #[diplomat::attr(auto, namespace = "icu4x")] pub mod ffi { use alloc::boxed::Box; use icu_calendar::Gregorian; use icu_datetime::fieldsets::enums::CompositeDateTimeFieldSet; use writeable::Writeable; use crate::{ date::ffi::{Date, IsoDate}, errors::ffi::DateTimeMismatchedCalendarError, time::ffi::Time, }; #[cfg(feature = "buffer_provider")] use crate::provider::ffi::DataProvider; #[cfg(any(feature = "compiled_data", feature = "buffer_provider"))] use crate::{ datetime_formatter::ffi::DateTimeLength, errors::ffi::DateTimeFormatterLoadError, locale_core::ffi::Locale, neo_datetime::map_or_default, }; #[diplomat::enum_convert(icu_datetime::options::Alignment, needs_wildcard)] #[diplomat::rust_link(icu::datetime::Alignment, Enum)] pub enum DateTimeAlignment { Auto, Column, } #[diplomat::enum_convert(icu_datetime::options::YearStyle, needs_wildcard)] #[diplomat::rust_link(icu::datetime::YearStyle, Enum)] pub enum YearStyle { Auto, Full, WithEra, } #[diplomat::rust_link(icu::datetime::TimePrecision, Enum)] pub enum TimePrecision { Hour, Minute, MinuteOptional, Second, Subsecond1, Subsecond2, Subsecond3, Subsecond4, Subsecond5, Subsecond6, Subsecond7, Subsecond8, Subsecond9, } #[diplomat::opaque] #[diplomat::rust_link(icu::datetime::DateTimeFormatter, Typedef)] pub struct DateTimeFormatter(pub icu_datetime::DateTimeFormatter); impl DateTimeFormatter { #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "dt")] #[diplomat::rust_link(icu::datetime::fieldsets::DT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::DT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::DT::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_dt( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::DT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new(prefs, options)?.cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "dt_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::DT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::DT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::DT::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_dt_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::DT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "mdt")] #[diplomat::rust_link(icu::datetime::fieldsets::MDT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::MDT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_mdt( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::MDT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new(prefs, options)?.cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "mdt_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::MDT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::MDT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_mdt_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::MDT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "ymdt")] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_year_style, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::hm, FnInStruct, hidden)] #[diplomat::demo(default_constructor)] #[cfg(feature = "compiled_data")] pub fn create_ymdt( locale: &Locale, length: Option, time_precision: Option, alignment: Option, year_style: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::YMDT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)) .with_year_style(map_or_default(year_style)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new(prefs, options)?.cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "ymdt_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_year_style, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_ymdt_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, year_style: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::YMDT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)) .with_year_style(map_or_default(year_style)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "det")] #[diplomat::rust_link(icu::datetime::fieldsets::DET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::DET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::DET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_det( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::DET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new(prefs, options)?.cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "det_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::DET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::DET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::DET::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_det_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::DET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "mdet")] #[diplomat::rust_link(icu::datetime::fieldsets::MDET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::MDET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_mdet( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::MDET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new(prefs, options)?.cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "mdet_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::MDET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::MDET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_mdet_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::MDET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "ymdet")] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDET::with_year_style, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_ymdet( locale: &Locale, length: Option, time_precision: Option, alignment: Option, year_style: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::YMDET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)) .with_year_style(map_or_default(year_style)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new(prefs, options)?.cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "ymdet_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDET::with_year_style, FnInStruct, compact )] #[cfg(feature = "buffer_provider")] pub fn create_ymdet_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, year_style: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::YMDET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)) .with_year_style(map_or_default(year_style)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "et")] #[diplomat::rust_link(icu::datetime::fieldsets::ET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::ET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::ET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_et( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::ET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new(prefs, options)?.cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "et_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::ET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::ET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::ET::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_et_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::ET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatter( icu_datetime::DateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::rust_link(icu::datetime::DateTimeFormatter::format, FnInStruct)] #[diplomat::rust_link(icu::datetime::FormattedDateTime, Struct, hidden)] #[diplomat::rust_link(icu::datetime::FormattedDateTime::to_string, FnInStruct, hidden)] pub fn format_iso( &self, date: &IsoDate, time: &Time, write: &mut diplomat_runtime::DiplomatWrite, ) { let value = icu_time::DateTime { date: date.0, time: time.0, }; let _infallible = self.0.format(&value).write_to(write); } #[diplomat::rust_link(icu::datetime::DateTimeFormatter::format_same_calendar, FnInStruct)] #[diplomat::rust_link(icu::datetime::FormattedDateTime, Struct, hidden)] #[diplomat::rust_link(icu::datetime::FormattedDateTime::to_string, FnInStruct, hidden)] pub fn format_same_calendar( &self, date: &Date, time: &Time, write: &mut diplomat_runtime::DiplomatWrite, ) -> Result<(), DateTimeMismatchedCalendarError> { let value = icu_time::DateTime { date: date.0.wrap_calendar_in_ref(), time: time.0, }; let _infallible = self.0.format_same_calendar(&value)?.write_to(write); Ok(()) } } #[diplomat::opaque] #[diplomat::rust_link(icu::datetime::FixedCalendarDateTimeFormatter, Typedef)] pub struct DateTimeFormatterGregorian( pub icu_datetime::FixedCalendarDateTimeFormatter, ); impl DateTimeFormatterGregorian { #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "dt")] #[diplomat::rust_link(icu::datetime::fieldsets::DT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::DT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::DT::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_dt( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::DT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new(prefs, options)? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "dt_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::DT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::DT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::DT::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_dt_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::DT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "mdt")] #[diplomat::rust_link(icu::datetime::fieldsets::MDT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::MDT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_mdt( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::MDT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new(prefs, options)? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "mdt_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::MDT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::MDT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::MDT::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_mdt_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::MDT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "ymdt")] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_year_style, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::hm, FnInStruct, hidden)] #[diplomat::demo(default_constructor)] #[cfg(feature = "compiled_data")] pub fn create_ymdt( locale: &Locale, length: Option, time_precision: Option, alignment: Option, year_style: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::YMDT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)) .with_year_style(map_or_default(year_style)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new(prefs, options)? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "ymdt_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDT::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDT::with_year_style, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_ymdt_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, year_style: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::YMDT::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)) .with_year_style(map_or_default(year_style)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "det")] #[diplomat::rust_link(icu::datetime::fieldsets::DET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::DET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::DET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_det( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::DET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new(prefs, options)? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "det_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::DET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::DET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::DET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::DET::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_det_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::DET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "mdet")] #[diplomat::rust_link(icu::datetime::fieldsets::MDET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::MDET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_mdet( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::MDET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new(prefs, options)? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "mdet_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::MDET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::MDET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::MDET::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_mdet_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::MDET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "ymdet")] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDET::with_year_style, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_ymdet( locale: &Locale, length: Option, time_precision: Option, alignment: Option, year_style: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::YMDET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)) .with_year_style(map_or_default(year_style)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new(prefs, options)? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "ymdet_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::YMDET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::YMDET::with_year_style, FnInStruct, compact )] #[cfg(feature = "buffer_provider")] pub fn create_ymdet_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, year_style: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::YMDET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)) .with_year_style(map_or_default(year_style)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "et")] #[diplomat::rust_link(icu::datetime::fieldsets::ET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::ET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::ET::with_alignment, FnInStruct, compact)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::short, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::medium, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::long, FnInStruct, hidden)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::hm, FnInStruct, hidden)] #[cfg(feature = "compiled_data")] pub fn create_et( locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::ET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new(prefs, options)? .cast_into_fset(), ))) } #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "et_with_provider")] #[diplomat::rust_link(icu::datetime::fieldsets::ET, Struct)] #[diplomat::rust_link(icu::datetime::fieldsets::ET::with_length, FnInStruct, compact)] #[diplomat::rust_link( icu::datetime::fieldsets::ET::with_time_precision, FnInStruct, compact )] #[diplomat::rust_link(icu::datetime::fieldsets::ET::with_alignment, FnInStruct, compact)] #[cfg(feature = "buffer_provider")] pub fn create_et_with_provider( provider: &DataProvider, locale: &Locale, length: Option, time_precision: Option, alignment: Option, ) -> Result, DateTimeFormatterLoadError> { let prefs = (&locale.0).into(); let options = icu_datetime::fieldsets::ET::with_length(map_or_default(length)) .with_alignment(map_or_default(alignment)) .with_time_precision(map_or_default(time_precision)); Ok(Box::new(DateTimeFormatterGregorian( icu_datetime::FixedCalendarDateTimeFormatter::try_new_with_buffer_provider( provider.get()?, prefs, options, )? .cast_into_fset(), ))) } #[diplomat::rust_link(icu::datetime::FixedCalendarDateTimeFormatter::format, FnInStruct)] #[diplomat::rust_link(icu::datetime::FormattedDateTime, Struct, hidden)] #[diplomat::rust_link(icu::datetime::FormattedDateTime::to_string, FnInStruct, hidden)] pub fn format_iso( &self, date: &IsoDate, time: &Time, write: &mut diplomat_runtime::DiplomatWrite, ) { let value = icu_time::DateTime { date: date.0.to_calendar(Gregorian), time: time.0, }; let _infallible = self.0.format(&value).write_to(write); } } } impl From for icu_datetime::options::TimePrecision { fn from(time_precision: ffi::TimePrecision) -> Self { use icu_datetime::options::TimePrecision; match time_precision { ffi::TimePrecision::Hour => TimePrecision::Hour, ffi::TimePrecision::Minute => TimePrecision::Minute, ffi::TimePrecision::MinuteOptional => TimePrecision::MinuteOptional, ffi::TimePrecision::Second => TimePrecision::Second, ffi::TimePrecision::Subsecond1 => TimePrecision::Subsecond(SubsecondDigits::S1), ffi::TimePrecision::Subsecond2 => TimePrecision::Subsecond(SubsecondDigits::S2), ffi::TimePrecision::Subsecond3 => TimePrecision::Subsecond(SubsecondDigits::S3), ffi::TimePrecision::Subsecond4 => TimePrecision::Subsecond(SubsecondDigits::S4), ffi::TimePrecision::Subsecond5 => TimePrecision::Subsecond(SubsecondDigits::S5), ffi::TimePrecision::Subsecond6 => TimePrecision::Subsecond(SubsecondDigits::S6), ffi::TimePrecision::Subsecond7 => TimePrecision::Subsecond(SubsecondDigits::S7), ffi::TimePrecision::Subsecond8 => TimePrecision::Subsecond(SubsecondDigits::S8), ffi::TimePrecision::Subsecond9 => TimePrecision::Subsecond(SubsecondDigits::S9), } } } #[cfg(any(feature = "compiled_data", feature = "buffer_provider"))] fn map_or_default(input: Option) -> Output where Output: From + Default, { input.map(Output::from).unwrap_or_default() }