1#![allow(bad_style)]
6#![allow(clippy::all)]
7
8macro_rules! char_property_functions {
9 {$(
10 mod $module:ident;
11 [$(
12 $prop:ident,
13 )*];
14 )*} => {$(
15 #[allow(unused)]
16 mod $module;
17 $(pub fn $prop(c: char) -> bool {
18 self::$module::$prop.contains_char(c)
19 })*
20 )*};
21}
22
23char_property_functions! {
24 mod binary;
25 [
26 ALPHABETIC, BIDI_CONTROL, CASE_IGNORABLE, CASED, CHANGES_WHEN_CASEFOLDED,
28 CHANGES_WHEN_CASEMAPPED, CHANGES_WHEN_LOWERCASED, CHANGES_WHEN_TITLECASED,
29 CHANGES_WHEN_UPPERCASED, DASH, DEFAULT_IGNORABLE_CODE_POINT, DEPRECATED, DIACRITIC,
30 EXTENDER, GRAPHEME_BASE, GRAPHEME_EXTEND, GRAPHEME_LINK, HEX_DIGIT, HYPHEN,
31 IDS_BINARY_OPERATOR, IDS_TRINARY_OPERATOR, ID_CONTINUE, ID_START, IDEOGRAPHIC, JOIN_CONTROL,
32 LOGICAL_ORDER_EXCEPTION, LOWERCASE, MATH, NONCHARACTER_CODE_POINT, OTHER_ALPHABETIC,
33 OTHER_DEFAULT_IGNORABLE_CODE_POINT, OTHER_GRAPHEME_EXTEND, OTHER_ID_CONTINUE,
34 OTHER_ID_START, OTHER_LOWERCASE, OTHER_MATH, OTHER_UPPERCASE, PATTERN_SYNTAX,
35 PATTERN_WHITE_SPACE, PREPENDED_CONCATENATION_MARK, QUOTATION_MARK, RADICAL,
36 REGIONAL_INDICATOR, SENTENCE_TERMINAL, SOFT_DOTTED, TERMINAL_PUNCTUATION, UNIFIED_IDEOGRAPH,
37 UPPERCASE, VARIATION_SELECTOR, WHITE_SPACE, XID_CONTINUE, XID_START,
38 ];
39
40 mod category;
41 [
42 CASED_LETTER, CLOSE_PUNCTUATION, CONNECTOR_PUNCTUATION, CONTROL, CURRENCY_SYMBOL,
43 DASH_PUNCTUATION, DECIMAL_NUMBER, ENCLOSING_MARK, FINAL_PUNCTUATION, FORMAT,
44 INITIAL_PUNCTUATION, LETTER, LETTER_NUMBER, LINE_SEPARATOR, LOWERCASE_LETTER, MARK,
45 MATH_SYMBOL, MODIFIER_LETTER, MODIFIER_SYMBOL, NONSPACING_MARK, NUMBER, OPEN_PUNCTUATION,
46 OTHER, OTHER_LETTER, OTHER_NUMBER, OTHER_PUNCTUATION, OTHER_SYMBOL, PARAGRAPH_SEPARATOR,
47 PRIVATE_USE, PUNCTUATION, SEPARATOR, SPACE_SEPARATOR, SPACING_MARK, SURROGATE, SYMBOL,
48 TITLECASE_LETTER, UNASSIGNED, UPPERCASE_LETTER,
49 ];
50}
51
52pub fn by_name(name: &str) -> Option<Box<Fn(char) -> bool>> {
53 for property in binary::BY_NAME {
54 if name == property.0.to_uppercase() {
55 return Some(Box::new(move |c| property.1.contains_char(c)));
56 }
57 }
58
59 for property in category::BY_NAME {
60 if name == property.0.to_uppercase() {
61 return Some(Box::new(move |c| property.1.contains_char(c)));
62 }
63 }
64
65 None
66}