1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).

//! *** Note: DO NOT USE THESE APIs FOR NOW. ****
//!  Performance improvements and other fixes are still needed on this component.

#![allow(clippy::unreadable_literal, dead_code)]

use crate::enum_props::*;
use crate::provider::*;
use crate::{UnicodeSet, UnicodeSetError};
use core::convert::TryInto;
use icu_provider::prelude::*;

type UnisetResult = Result<UnicodeSet, UnicodeSetError>;

// helper fn
fn get_prop<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(ppucd_provider: &D, resc_key: ResourceKey) -> UnisetResult {
    let data_req = DataRequest {
        resource_path: ResourcePath {
            key: resc_key,
            options: ResourceOptions { variant: None, langid: None },
        },
    };
    let resp: DataResponse<UnicodePropertyV1Marker> = ppucd_provider.load_payload(&data_req)?;

    let ppucd_property_payload: DataPayload<UnicodePropertyV1Marker> = resp.take_payload()?;
    let ppucd_property: UnicodePropertyV1 = ppucd_property_payload.get().clone();
    ppucd_property.try_into()
}

//
// Binary property getter fns
//

pub fn get_ascii_hex_digit_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::ASCII_HEX_DIGIT_V1)
}

pub fn get_alnum_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::ALNUM_V1)
}

pub fn get_alphabetic_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::ALPHABETIC_V1)
}

pub fn get_bidi_control_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::BIDI_CONTROL_V1)
}

pub fn get_bidi_mirrored_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::BIDI_MIRRORED_V1)
}

pub fn get_blank_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::BLANK_V1)
}

pub fn get_cased_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::CASED_V1)
}

pub fn get_case_ignorable_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::CASE_IGNORABLE_V1)
}

pub fn get_full_composition_exclusion_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::FULL_COMPOSITION_EXCLUSION_V1)
}

pub fn get_changes_when_casefolded_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::CHANGES_WHEN_CASEFOLDED_V1)
}

pub fn get_changes_when_casemapped_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::CHANGES_WHEN_CASEMAPPED_V1)
}

pub fn get_changes_when_nfkc_casefolded_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::CHANGES_WHEN_NFKC_CASEFOLDED_V1)
}

pub fn get_changes_when_lowercased_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::CHANGES_WHEN_LOWERCASED_V1)
}

pub fn get_changes_when_titlecased_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::CHANGES_WHEN_TITLECASED_V1)
}

pub fn get_changes_when_uppercased_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::CHANGES_WHEN_UPPERCASED_V1)
}

pub fn get_dash_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::DASH_V1)
}

pub fn get_deprecated_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::DEPRECATED_V1)
}

pub fn get_default_ignorable_code_point_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::DEFAULT_IGNORABLE_CODE_POINT_V1)
}

pub fn get_diacritic_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::DIACRITIC_V1)
}

pub fn get_emoji_modifier_base_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::EMOJI_MODIFIER_BASE_V1)
}

pub fn get_emoji_component_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::EMOJI_COMPONENT_V1)
}

pub fn get_emoji_modifier_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::EMOJI_MODIFIER_V1)
}

pub fn get_emoji_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::EMOJI_V1)
}

pub fn get_emoji_presentation_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::EMOJI_PRESENTATION_V1)
}

pub fn get_extender_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::EXTENDER_V1)
}

pub fn get_extended_pictographic_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::EXTENDED_PICTOGRAPHIC_V1)
}

pub fn get_graph_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::GRAPH_V1)
}

pub fn get_grapheme_base_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::GRAPHEME_BASE_V1)
}

pub fn get_grapheme_extend_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::GRAPHEME_EXTEND_V1)
}

pub fn get_grapheme_link_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::GRAPHEME_LINK_V1)
}

pub fn get_hex_digit_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::HEX_DIGIT_V1)
}

pub fn get_hyphen_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::HYPHEN_V1)
}

pub fn get_id_continue_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::ID_CONTINUE_V1)
}

pub fn get_ideographic_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::IDEOGRAPHIC_V1)
}

pub fn get_id_start_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::ID_START_V1)
}

pub fn get_ids_binary_operator_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::IDS_BINARY_OPERATOR_V1)
}

pub fn get_ids_trinary_operator_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::IDS_TRINARY_OPERATOR_V1)
}

pub fn get_join_control_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::JOIN_CONTROL_V1)
}

pub fn get_logical_order_exception_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::LOGICAL_ORDER_EXCEPTION_V1)
}

pub fn get_lowercase_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::LOWERCASE_V1)
}

pub fn get_math_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::MATH_V1)
}

pub fn get_noncharacter_code_point_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::NONCHARACTER_CODE_POINT_V1)
}

pub fn get_nfc_inert_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::NFC_INERT_V1)
}

pub fn get_nfd_inert_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::NFD_INERT_V1)
}

pub fn get_nfkc_inert_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::NFKC_INERT_V1)
}

pub fn get_nfkd_inert_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::NFKD_INERT_V1)
}

pub fn get_pattern_syntax_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::PATTERN_SYNTAX_V1)
}

pub fn get_pattern_white_space_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::PATTERN_WHITE_SPACE_V1)
}

pub fn get_prepended_concatenation_mark_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::PREPENDED_CONCATENATION_MARK_V1)
}

pub fn get_print_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::PRINT_V1)
}

pub fn get_quotation_mark_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::QUOTATION_MARK_V1)
}

pub fn get_radical_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::RADICAL_V1)
}

pub fn get_regional_indicator_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::REGIONAL_INDICATOR_V1)
}

pub fn get_soft_dotted_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::SOFT_DOTTED_V1)
}

pub fn get_segment_starter_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::SEGMENT_STARTER_V1)
}

pub fn get_case_sensitive_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::CASE_SENSITIVE_V1)
}

pub fn get_sentence_terminal_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::SENTENCE_TERMINAL_V1)
}

pub fn get_terminal_punctuation_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::TERMINAL_PUNCTUATION_V1)
}

pub fn get_unified_ideograph_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::UNIFIED_IDEOGRAPH_V1)
}

pub fn get_uppercase_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::UPPERCASE_V1)
}

pub fn get_variation_selector_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::VARIATION_SELECTOR_V1)
}

pub fn get_white_space_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::WHITE_SPACE_V1)
}

pub fn get_xdigit_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::XDIGIT_V1)
}

pub fn get_xid_continue_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::XID_CONTINUE_V1)
}

pub fn get_xid_start_property<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D) -> UnisetResult {
    get_prop(provider, key::XID_START_V1)
}

//
// Enumerated property getter fns
//

/// Return a [`UnicodeSet`] for a particular value of the General_Category Unicode enumerated property
/// General_Category specifies enumerated Unicode general category types.
/// See https://www.unicode.org/reports/tr44/ .
pub fn get_general_category_val_set<'data, D: DataProvider<'data, UnicodePropertyV1Marker> + ?Sized>(provider: &D, enum_val: GeneralCategory) -> UnisetResult {
    match enum_val {
        GeneralCategory::Control => get_prop(provider, key::GENERAL_CATEGORY_CONTROL_V1),
        GeneralCategory::Format => get_prop(provider, key::GENERAL_CATEGORY_FORMAT_V1),
        GeneralCategory::Unassigned => get_prop(provider, key::GENERAL_CATEGORY_UNASSIGNED_V1),
        GeneralCategory::PrivateUse => get_prop(provider, key::GENERAL_CATEGORY_PRIVATE_USE_V1),
        GeneralCategory::Surrogate => get_prop(provider, key::GENERAL_CATEGORY_SURROGATE_V1),
        GeneralCategory::LowercaseLetter => get_prop(provider, key::GENERAL_CATEGORY_LOWERCASE_LETTER_V1),
        GeneralCategory::ModifierLetter => get_prop(provider, key::GENERAL_CATEGORY_MODIFIER_LETTER_V1),
        GeneralCategory::OtherLetter => get_prop(provider, key::GENERAL_CATEGORY_OTHER_LETTER_V1),
        GeneralCategory::TitlecaseLetter => get_prop(provider, key::GENERAL_CATEGORY_TITLECASE_LETTER_V1),
        GeneralCategory::UppercaseLetter => get_prop(provider, key::GENERAL_CATEGORY_UPPERCASE_LETTER_V1),
        GeneralCategory::SpacingMark => get_prop(provider, key::GENERAL_CATEGORY_SPACING_MARK_V1),
        GeneralCategory::EnclosingMark => get_prop(provider, key::GENERAL_CATEGORY_ENCLOSING_MARK_V1),
        GeneralCategory::NonspacingMark => get_prop(provider, key::GENERAL_CATEGORY_NONSPACING_MARK_V1),
        GeneralCategory::Digit => get_prop(provider, key::GENERAL_CATEGORY_DIGIT_V1),
        GeneralCategory::LetterNumber => get_prop(provider, key::GENERAL_CATEGORY_LETTER_NUMBER_V1),
        GeneralCategory::OtherNumber => get_prop(provider, key::GENERAL_CATEGORY_OTHER_NUMBER_V1),
        GeneralCategory::ConnectorPunctuation => get_prop(provider, key::GENERAL_CATEGORY_CONNECTOR_PUNCTUATION_V1),
        GeneralCategory::DashPunctuation => get_prop(provider, key::GENERAL_CATEGORY_DASH_PUNCTUATION_V1),
        GeneralCategory::ClosePunctuation => get_prop(provider, key::GENERAL_CATEGORY_CLOSE_PUNCTUATION_V1),
        GeneralCategory::FinalPunctuation => get_prop(provider, key::GENERAL_CATEGORY_FINAL_PUNCTUATION_V1),
        GeneralCategory::InitialPunctuation => get_prop(provider, key::GENERAL_CATEGORY_INITIAL_PUNCTUATION_V1),
        GeneralCategory::OtherPunctuation => get_prop(provider, key::GENERAL_CATEGORY_OTHER_PUNCTUATION_V1),
        GeneralCategory::OpenPunctuation => get_prop(provider, key::GENERAL_CATEGORY_OPEN_PUNCTUATION_V1),
        GeneralCategory::CurrencySymbol => get_prop(provider, key::GENERAL_CATEGORY_CURRENCY_SYMBOL_V1),
        GeneralCategory::ModifierSymbol => get_prop(provider, key::GENERAL_CATEGORY_MODIFIER_SYMBOL_V1),
        GeneralCategory::MathSymbol => get_prop(provider, key::GENERAL_CATEGORY_MATH_SYMBOL_V1),
        GeneralCategory::OtherSymbol => get_prop(provider, key::GENERAL_CATEGORY_OTHER_SYMBOL_V1),
        GeneralCategory::LineSeparator => get_prop(provider, key::GENERAL_CATEGORY_LINE_SEPARATOR_V1),
        GeneralCategory::ParagraphSeparator => get_prop(provider, key::GENERAL_CATEGORY_PARAGRAPH_SEPARATOR_V1),
        GeneralCategory::SpaceSeparator => get_prop(provider, key::GENERAL_CATEGORY_SPACE_SEPARATOR_V1),
    }
}