icu_capi/
time_formatter.rs
1#[rustfmt::skip]
8#[diplomat::bridge]
9#[diplomat::abi_rename = "icu4x_{0}_mv1"]
10#[diplomat::attr(auto, namespace = "icu4x")]
11pub mod ffi {
12 use alloc::boxed::Box;
13 use writeable::Writeable;
14
15 #[allow(unused_imports)]
16 use crate::{
17 date::ffi::{Date, IsoDate},
18 datetime::ffi::DateTime,
19 datetime_helpers::map_or_default,
20 datetime_options::ffi::{DateTimeAlignment, DateTimeLength, TimePrecision, YearStyle},
21 errors::ffi::DateTimeFormatterLoadError,
22 errors::ffi::DateTimeMismatchedCalendarError,
23 locale_core::ffi::Locale,
24 time::ffi::Time,
25 };
26
27 #[cfg(feature = "buffer_provider")]
28 use crate::provider::ffi::DataProvider;
29
30 #[diplomat::opaque]
31 #[diplomat::rust_link(icu::datetime::FixedCalendarDateTimeFormatter, Typedef)]
32 pub struct TimeFormatter(
33 pub icu_datetime::FixedCalendarDateTimeFormatter<
34 (),
35 icu_datetime::fieldsets::enums::TimeFieldSet,
36 >,
37 );
38
39 impl TimeFormatter {
40 #[diplomat::attr(supports = fallible_constructors, constructor)]
41 #[diplomat::rust_link(icu::datetime::fieldsets::T, Struct)]
42 #[diplomat::rust_link(icu::datetime::fieldsets::T::with_time_precision, FnInStruct, compact)]
43 #[diplomat::rust_link(icu::datetime::fieldsets::T::with_alignment, FnInStruct, compact)]
44 #[diplomat::rust_link(icu::datetime::fieldsets::T::with_length, FnInStruct, compact)]
45 #[diplomat::rust_link(icu::datetime::fieldsets::T::short, FnInStruct, hidden)]
46 #[diplomat::rust_link(icu::datetime::fieldsets::T::medium, FnInStruct, hidden)]
47 #[diplomat::rust_link(icu::datetime::fieldsets::T::long, FnInStruct, hidden)]
48 #[diplomat::demo(default_constructor)]
49 #[cfg(feature = "compiled_data")]
50 pub fn create(
51 locale: &Locale,
52 length: Option<DateTimeLength>,
53 time_precision: Option<TimePrecision>,
54 alignment: Option<DateTimeAlignment>,
55 ) -> Result<Box<Self>, DateTimeFormatterLoadError> {
56 let prefs = (&locale.0).into();
57 let mut options = icu_datetime::fieldsets::T::with_length(map_or_default(length));
58 options.time_precision = time_precision.map(Into::into);
59 options.alignment = alignment.map(Into::into);
60 Ok(Box::new(Self(
61 icu_datetime
62 ::FixedCalendarDateTimeFormatter
63 ::try_new(
64 prefs,
65 options
66 )?
67 .cast_into_fset(),
68 )))
69 }
70
71 #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "with_provider")]
72 #[diplomat::rust_link(icu::datetime::fieldsets::T, Struct)]
73 #[diplomat::rust_link(icu::datetime::fieldsets::T::with_time_precision, FnInStruct, compact)]
74 #[diplomat::rust_link(icu::datetime::fieldsets::T::with_alignment, FnInStruct, compact)]
75 #[diplomat::rust_link(icu::datetime::fieldsets::T::with_length, FnInStruct, compact)]
76 #[diplomat::rust_link(icu::datetime::fieldsets::T::short, FnInStruct, hidden)]
77 #[diplomat::rust_link(icu::datetime::fieldsets::T::medium, FnInStruct, hidden)]
78 #[diplomat::rust_link(icu::datetime::fieldsets::T::long, FnInStruct, hidden)]
79 #[cfg(feature = "buffer_provider")]
80 pub fn create_with_provider(
81 provider: &DataProvider,
82 locale: &Locale,
83 length: Option<DateTimeLength>,
84 time_precision: Option<TimePrecision>,
85 alignment: Option<DateTimeAlignment>,
86 ) -> Result<Box<Self>, DateTimeFormatterLoadError> {
87 let prefs = (&locale.0).into();
88 let mut options = icu_datetime::fieldsets::T::with_length(map_or_default(length));
89 options.time_precision = time_precision.map(Into::into);
90 options.alignment = alignment.map(Into::into);
91 Ok(Box::new(Self(
92 icu_datetime
93 ::FixedCalendarDateTimeFormatter
94 ::try_new_with_buffer_provider(
95 provider.get()?,
96 prefs,
97 options
98 )?
99 .cast_into_fset(),
100 )))
101 }
102
103 #[diplomat::rust_link(icu::datetime::FixedCalendarDateTimeFormatter::format, FnInStruct)]
104 #[diplomat::rust_link(icu::datetime::FormattedDateTime, Struct, hidden)]
105 #[diplomat::rust_link(icu::datetime::FormattedDateTime::to_string, FnInStruct, hidden)]
106 pub fn format(
107 &self,
108 time: &Time,
109 write: &mut diplomat_runtime::DiplomatWrite,
110 ) {
111 let value = time.0;
112 let _infallible = self.0.format(&value).write_to(write);
113 }
114
115 }
116
117}