• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This file is part of ICU4X. For terms of use, please see the file
2 // called LICENSE at the top level of the ICU4X source tree
3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4 
5 #[diplomat::bridge]
6 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
7 #[diplomat::attr(auto, namespace = "icu4x")]
8 pub mod ffi {
9     use alloc::boxed::Box;
10     use icu_calendar::Iso;
11 
12     use crate::calendar::ffi::Calendar;
13     use crate::date::ffi::{Date, IsoDate};
14     use crate::errors::ffi::CalendarParseError;
15     use crate::time::ffi::Time;
16 
17     /// An ICU4X DateTime object capable of containing a ISO-8601 date and time.
18     #[diplomat::rust_link(icu::time::DateTime, Struct)]
19     #[diplomat::out]
20     pub struct IsoDateTime {
21         pub date: Box<IsoDate>,
22         pub time: Box<Time>,
23     }
24 
25     impl IsoDateTime {
26         /// Creates a new [`IsoDateTime`] from an IXDTF string.
27         #[diplomat::rust_link(icu::time::DateTime::try_from_str, FnInStruct)]
28         #[diplomat::rust_link(icu::time::DateTime::try_from_utf8, FnInStruct, hidden)]
29         #[diplomat::rust_link(icu::time::DateTime::from_str, FnInStruct, hidden)]
30         #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor)]
from_string(v: &DiplomatStr) -> Result<IsoDateTime, CalendarParseError>31         pub fn from_string(v: &DiplomatStr) -> Result<IsoDateTime, CalendarParseError> {
32             let icu_time::DateTime { date, time } = icu_time::DateTime::try_from_utf8(v, Iso)?;
33             Ok(IsoDateTime {
34                 date: Box::new(IsoDate(date)),
35                 time: Box::new(Time(time)),
36             })
37         }
38     }
39 
40     /// An ICU4X DateTime object capable of containing a date and time for any calendar.
41     #[diplomat::rust_link(icu::time::DateTime, Struct)]
42     #[diplomat::out]
43     pub struct DateTime {
44         pub date: Box<Date>,
45         pub time: Box<Time>,
46     }
47 
48     impl DateTime {
49         /// Creates a new [`DateTime`] from an IXDTF string.
50         #[diplomat::rust_link(icu::time::DateTime::try_from_str, FnInStruct)]
51         #[diplomat::rust_link(icu::time::DateTime::try_from_utf8, FnInStruct, hidden)]
52         #[diplomat::rust_link(icu::time::DateTime::from_str, FnInStruct, hidden)]
53         #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor)]
from_string( v: &DiplomatStr, calendar: &Calendar, ) -> Result<DateTime, CalendarParseError>54         pub fn from_string(
55             v: &DiplomatStr,
56             calendar: &Calendar,
57         ) -> Result<DateTime, CalendarParseError> {
58             let icu_time::DateTime { date, time } =
59                 icu_time::DateTime::try_from_utf8(v, calendar.0.clone())?;
60             Ok(DateTime {
61                 date: Box::new(Date(date)),
62                 time: Box::new(Time(time)),
63             })
64         }
65     }
66 }
67