1#[diplomat::bridge]
6#[diplomat::abi_rename = "icu4x_{0}_mv1"]
7pub mod ffi {
8 use alloc::boxed::Box;
9 use alloc::sync::Arc;
10
11 #[cfg(feature = "buffer_provider")]
12 use crate::unstable::errors::ffi::DataError;
13 use crate::unstable::locale_core::ffi::Locale;
14 #[cfg(feature = "buffer_provider")]
15 use crate::unstable::provider::ffi::DataProvider;
16
17 #[diplomat::enum_convert(icu_calendar::AnyCalendarKind, needs_wildcard)]
19 #[diplomat::rust_link(icu::calendar::AnyCalendarKind, Enum)]
20 #[non_exhaustive]
21 pub enum CalendarKind {
22 #[diplomat::attr(auto, default)]
26 Iso = 0,
27 Gregorian = 1,
29 Buddhist = 2,
31 Japanese = 3,
33 JapaneseExtended = 4,
35 Ethiopian = 5,
37 EthiopianAmeteAlem = 6,
39 Indian = 7,
41 Coptic = 8,
43 Dangi = 9,
45 Chinese = 10,
47 Hebrew = 11,
49 HijriTabularTypeIIFriday = 12,
51 HijriSimulatedMecca = 18,
53 HijriTabularTypeIIThursday = 14,
55 HijriUmmAlQura = 15,
57 Persian = 16,
59 Roc = 17,
61 }
62
63 impl CalendarKind {
64 #[diplomat::rust_link(icu::calendar::AnyCalendarKind::new, FnInEnum)]
66 pub fn create(locale: &Locale) -> Self {
67 let prefs = (&locale.0).into();
68 icu_calendar::AnyCalendarKind::new(prefs).into()
69 }
70 }
71
72 #[diplomat::opaque]
73 #[diplomat::transparent_convert]
74 #[diplomat::rust_link(icu::calendar::AnyCalendar, Enum)]
75 pub struct Calendar(pub Arc<icu_calendar::AnyCalendar>);
76
77 impl Calendar {
78 #[diplomat::rust_link(icu::calendar::AnyCalendar::new, FnInEnum)]
80 #[diplomat::attr(auto, constructor)]
81 #[cfg(feature = "compiled_data")]
82 pub fn create(kind: CalendarKind) -> Box<Calendar> {
83 Box::new(Calendar(Arc::new(icu_calendar::AnyCalendar::new(
84 kind.into(),
85 ))))
86 }
87
88 #[diplomat::rust_link(icu::calendar::AnyCalendar::new, FnInEnum)]
90 #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "new_with_provider")]
91 #[cfg(feature = "buffer_provider")]
92 pub fn create_with_provider(
93 provider: &DataProvider,
94 kind: CalendarKind,
95 ) -> Result<Box<Calendar>, DataError> {
96 Ok(Box::new(Calendar(Arc::new(
97 icu_calendar::AnyCalendar::try_new_with_buffer_provider(
98 provider.get()?,
99 kind.into(),
100 )?,
101 ))))
102 }
103
104 #[diplomat::rust_link(icu::calendar::AnyCalendar::kind, FnInEnum)]
106 #[diplomat::attr(auto, getter)]
107 #[diplomat::attr(demo_gen, disable)] pub fn kind(&self) -> CalendarKind {
109 self.0.kind().into()
110 }
111 }
112}