unicode/
category.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2pub enum General { Letter(Letter), Mark(Mark), Number(Number), Punctuation(Punctuation),
3                   Symbol(Symbol), Separator(Separator), Other(Other) }
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6pub enum Letter { UpperCase, LowerCase, TitleCase, Modifier, Other }
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub enum Mark { NonSpacing, Combining, Enclosing }
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12pub enum Number { Decimal, Letter, Other }
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15pub enum Punctuation { Connector, Dash, Open, Close, InitialQuote, FinalQuote, Other }
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18pub enum Symbol { Math, Currency, Modifier, Other }
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
21pub enum Separator { Space, Line, Paragraph }
22
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
24pub enum Other { Control, Format, Surrogate, Private, NotAssigned }
25
26impl General {
27    pub(crate) fn en(n: usize) -> Self {
28        use self::{Letter as L, Mark as M, Number as N, Punctuation as P, Symbol as S, Separator as T, Other as O};
29        use self::General::*;
30        [Letter(L::UpperCase), Letter(L::LowerCase), Letter(L::TitleCase), Letter(L::Modifier), Letter(L::Other),
31         Mark(M::NonSpacing), Mark(M::Combining), Mark(M::Enclosing), Number(N::Decimal), Number(N::Letter), Number(N::Other),
32         Punctuation(P::Connector), Punctuation(P::Dash), Punctuation(P::Open), Punctuation(P::Close), Punctuation(P::InitialQuote), Punctuation(P::FinalQuote), Punctuation(P::Other),
33         Symbol(S::Math), Symbol(S::Currency), Symbol(S::Modifier), Symbol(S::Other), Separator(T::Space), Separator(T::Line), Separator(T::Paragraph),
34         Other(O::Control), Other(O::Format), Other(O::Surrogate), Other(O::Private), Other(O::NotAssigned)][n]
35    }
36}