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};
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;
19 /// A generic data struct to be used by ICU4X
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.
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,
43 ) -> Result<Box<ICU4XDataStruct>, ICU4XError> {
44 use super::str_to_cow;
45 use icu_decimal::provider::{
46 AffixesV1, DecimalSymbolsV1, DecimalSymbolsV1Marker, GroupingSizesV1,
48 let digits = if digits.len() == 10 {
49 let mut new_digits = ['\0'; 10];
50 new_digits.copy_from_slice(digits);
53 return Err(ICU4XError::DataStructValidityError);
55 let plus_sign_affixes = AffixesV1 {
56 prefix: str_to_cow(plus_sign_prefix),
57 suffix: str_to_cow(plus_sign_suffix),
59 let minus_sign_affixes = AffixesV1 {
60 prefix: str_to_cow(minus_sign_prefix),
61 suffix: str_to_cow(minus_sign_suffix),
63 let grouping_sizes = GroupingSizesV1 {
64 primary: primary_group_size,
65 secondary: secondary_group_size,
66 min_grouping: min_group_size,
69 let symbols = DecimalSymbolsV1 {
72 decimal_separator: str_to_cow(decimal_separator),
73 grouping_separator: str_to_cow(grouping_separator),
78 let payload: DataPayload<DecimalSymbolsV1Marker> = DataPayload::from_owned(symbols);
79 Ok(Box::new(ICU4XDataStruct(payload.wrap_into_any_payload())))
83 #[cfg(feature = "icu_decimal")]
84 fn str_to_cow(s: &str) -> Cow<'static, str> {
88 Cow::from(s.to_owned())