Backed out 2 changesets (bug 903746) for causing non-unified build bustages on nsIPri...
[gecko.git] / intl / icu_capi / src / data_struct.rs
blob60765cec2419a67b0666896a9bca8541cd1f6a61
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 ).
5 #[cfg(feature = "icu_decimal")]
6 use alloc::borrow::{Cow, ToOwned};
8 #[diplomat::bridge]
9 pub mod ffi {
11     #[cfg(feature = "icu_decimal")]
12     use crate::errors::ffi::ICU4XError;
13     use alloc::boxed::Box;
14     use icu_provider::AnyPayload;
15     #[cfg(feature = "icu_decimal")]
16     use icu_provider::DataPayload;
18     #[diplomat::opaque]
19     /// A generic data struct to be used by ICU4X
20     ///
21     /// This can be used to construct a StructDataProvider.
22     #[diplomat::attr(dart, disable)]
23     pub struct ICU4XDataStruct(#[allow(dead_code)] AnyPayload);
25     impl ICU4XDataStruct {
26         /// Construct a new DecimalSymbolsV1 data struct.
27         ///
28         /// C++ users: All string arguments must be valid UTF8
29         #[diplomat::rust_link(icu::decimal::provider::DecimalSymbolsV1, Struct)]
30         #[allow(clippy::too_many_arguments)]
31         #[cfg(feature = "icu_decimal")]
32         pub fn create_decimal_symbols_v1(
33             plus_sign_prefix: &str,
34             plus_sign_suffix: &str,
35             minus_sign_prefix: &str,
36             minus_sign_suffix: &str,
37             decimal_separator: &str,
38             grouping_separator: &str,
39             primary_group_size: u8,
40             secondary_group_size: u8,
41             min_group_size: u8,
42             digits: &[char],
43         ) -> Result<Box<ICU4XDataStruct>, ICU4XError> {
44             use super::str_to_cow;
45             use icu_decimal::provider::{
46                 AffixesV1, DecimalSymbolsV1, DecimalSymbolsV1Marker, GroupingSizesV1,
47             };
48             let digits = if digits.len() == 10 {
49                 let mut new_digits = ['\0'; 10];
50                 new_digits.copy_from_slice(digits);
51                 new_digits
52             } else {
53                 return Err(ICU4XError::DataStructValidityError);
54             };
55             let plus_sign_affixes = AffixesV1 {
56                 prefix: str_to_cow(plus_sign_prefix),
57                 suffix: str_to_cow(plus_sign_suffix),
58             };
59             let minus_sign_affixes = AffixesV1 {
60                 prefix: str_to_cow(minus_sign_prefix),
61                 suffix: str_to_cow(minus_sign_suffix),
62             };
63             let grouping_sizes = GroupingSizesV1 {
64                 primary: primary_group_size,
65                 secondary: secondary_group_size,
66                 min_grouping: min_group_size,
67             };
69             let symbols = DecimalSymbolsV1 {
70                 plus_sign_affixes,
71                 minus_sign_affixes,
72                 decimal_separator: str_to_cow(decimal_separator),
73                 grouping_separator: str_to_cow(grouping_separator),
74                 grouping_sizes,
75                 digits,
76             };
78             let payload: DataPayload<DecimalSymbolsV1Marker> = DataPayload::from_owned(symbols);
79             Ok(Box::new(ICU4XDataStruct(payload.wrap_into_any_payload())))
80         }
81     }
83 #[cfg(feature = "icu_decimal")]
84 fn str_to_cow(s: &str) -> Cow<'static, str> {
85     if s.is_empty() {
86         Cow::default()
87     } else {
88         Cow::from(s.to_owned())
89     }