Skip to main content

passay_rs/rule/
sequence_data.rs

1use crate::rule::character_sequence::CharacterSequence;
2
3/// Container for one or more CharacterSequence.
4///
5/// # Author
6/// Middleware Services
7pub trait SequenceData {
8    /// Return the error code used for message resolution.
9    ///
10    /// # Returns
11    /// error code
12    fn error_code(&self) -> &str;
13
14    /// # Returns
15    /// one or more illegal character sequences.
16    fn get_sequences(&self) -> Vec<CharacterSequence>;
17}
18
19/// English character sequences.
20///
21/// # Author
22/// Middleware Services
23#[derive(Debug, PartialEq, Eq)]
24pub enum EnglishSequenceData {
25    Alphabetical,
26    Numerical,
27    USQwerty,
28}
29
30impl SequenceData for EnglishSequenceData {
31    fn error_code(&self) -> &str {
32        match self {
33            EnglishSequenceData::Alphabetical => "ILLEGAL_ALPHABETICAL_SEQUENCE",
34            EnglishSequenceData::Numerical => "ILLEGAL_NUMERICAL_SEQUENCE",
35            EnglishSequenceData::USQwerty => "ILLEGAL_QWERTY_SEQUENCE",
36        }
37    }
38
39    fn get_sequences(&self) -> Vec<CharacterSequence> {
40        match self {
41            EnglishSequenceData::Alphabetical =>
42                vec![CharacterSequence::new(vec![
43                    "abcdefghijklmnopqrstuvwxyz".to_string(),
44                    "ABCDEFGHIJKLMNOPQRSTUVWXYZ".to_string(),
45                ])
46                    .unwrap()],
47            EnglishSequenceData::Numerical =>
48                vec![
49                    CharacterSequence::new(vec!["0123456789".to_string()]).unwrap(),
50                ],
51            EnglishSequenceData::USQwerty =>
52                vec![
53                    CharacterSequence::new(vec![
54                        "`1234567890-=".to_string(),
55                        "~!@#$%^&*()_+".to_string(),
56                        "\u{0}\u{a1}\u{2122}\u{a3}\u{a2}\u{221e}\u{a7}\u{b6}\u{2022}\u{aa}\u{ba}\u{2013}\u{2260}".to_string(),
57                        "\u{60}\u{2044}\u{20ac}\u{2039}\u{203a}\u{fb01}\u{fb02}\u{2021}\u{b0}\u{b7}\u{201a}\u{2014}\u{b1}".to_string()
58                    ])
59                        .unwrap(),
60                    CharacterSequence::new(vec![
61                        "qwertyuiop[]\\".to_string(),
62                        "QWERTYUIOP{}|".to_string(),
63                        "\u{153}\u{2211}\u{0}\u{ae}\u{2020}\u{a5}\u{0}\u{0}\u{f8}\u{3c0}\u{201c}\u{2018}\u{ab}".to_string(),
64                        "\u{152}\u{201e}\u{b4}\u{2030}\u{2c7}\u{c1}\u{a8}\u{2c6}\u{d8}\u{220f}\u{201d}\u{2019}\u{bb}".to_string()
65                    ])
66                        .unwrap(),
67                    CharacterSequence::new(vec![
68                        "asdfghjkl;'".to_string(),
69                        "ASDFGHJKL:\"".to_string(),
70                        "\u{e5}\u{df}\u{2202}\u{192}\u{a9}\u{2d9}\u{2206}\u{2da}\u{ac}\u{2026}\u{e6}".to_string(),
71                        "\u{c5}\u{cd}\u{ce}\u{cf}\u{2dd}\u{d3}\u{d4}\u{f8ff}\u{d2}\u{da}\u{c6}".to_string(),
72                    ])
73                        .unwrap(),
74                    CharacterSequence::new(vec![
75                        "zxcvbnm,./".to_string(),
76                        "ZXCVBNM<>?".to_string(),
77                        "\u{39}\u{2248}\u{e7}\u{221a}\u{222b}\u{0}\u{b5}\u{2264}\u{2265}\u{f7}".to_string(),
78                        "\u{b8}\u{2db}\u{c7}\u{25ca}\u{131}\u{2dc}\u{c2}\u{af}\u{2d8}\u{bf}".to_string(),
79                    ])
80                        .unwrap(),
81                ],
82        }
83    }
84}
85
86/// Polish character sequences.
87pub enum PolishSequenceData {
88    Alphabetical,
89}
90
91impl SequenceData for PolishSequenceData {
92    fn error_code(&self) -> &str {
93        match self {
94            PolishSequenceData::Alphabetical => "ILLEGAL_ALPHABETICAL_SEQUENCE",
95        }
96    }
97
98    fn get_sequences(&self) -> Vec<CharacterSequence> {
99        match self {
100            PolishSequenceData::Alphabetical => vec![
101                CharacterSequence::new(vec![
102                    "aąbcćdeęfghijklłmnńoópqrsśtuwxyzźż".to_string(),
103                    "AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUWXYZŹŻ".to_string(),
104                ])
105                .unwrap(),
106            ],
107        }
108    }
109}
110
111pub enum GermanSequenceData {
112    Alphabetical,
113    DEQwertz,
114}
115
116impl SequenceData for GermanSequenceData {
117    fn error_code(&self) -> &str {
118        match self {
119            GermanSequenceData::Alphabetical => "ILLEGAL_ALPHABETICAL_SEQUENCE",
120            GermanSequenceData::DEQwertz => "ILLEGAL_QWERTY_SEQUENCE",
121        }
122    }
123
124    fn get_sequences(&self) -> Vec<CharacterSequence> {
125        match self {
126            GermanSequenceData::Alphabetical => vec![
127                CharacterSequence::new(vec![
128                    "abcdefghijklmnopqrstuvwxyzäöüß".to_string(),
129                    "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜẞ".to_string(),
130                ])
131                .unwrap(),
132            ],
133            GermanSequenceData::DEQwertz => vec![
134                CharacterSequence::new(vec![
135                    "^1234567890ß´".to_string(),
136                    "°!\"§$%&/()=?`".to_string(),
137                    // "\u{0000}\u{0000}²³\u{0000}\u{0000}\u{0000}{[]}\\\u{0000}".to_string(),
138                ])
139                .unwrap(),
140                CharacterSequence::new(vec![
141                    "qwertzuiopü+".to_string(),
142                    "QWERTZUIOPÜ*".to_string(),
143                    // "@\u{0000}€\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}~".to_string(),
144                ])
145                .unwrap(),
146                CharacterSequence::new(vec![
147                    "asdfghjklöä#".to_string(),
148                    "ASDFGHJKLÖÄ'".to_string(),
149                    // "\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}".to_string(),
150                ])
151                .unwrap(),
152                CharacterSequence::new(vec![
153                    "<yxcvbnm,.-".to_string(),
154                    ">YXCVBNM;:_".to_string(),
155                    // "|\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}\u{0000}µ\u{0000}\u{0000}\u{0000}".to_string(),
156                ])
157                .unwrap(),
158            ],
159        }
160    }
161}
162
163pub enum CzechSequenceData {
164    Alphabetical,
165}
166
167impl SequenceData for CzechSequenceData {
168    fn error_code(&self) -> &str {
169        match self {
170            CzechSequenceData::Alphabetical => "ILLEGAL_ALPHABETICAL_SEQUENCE",
171        }
172    }
173
174    fn get_sequences(&self) -> Vec<CharacterSequence> {
175        match self {
176            CzechSequenceData::Alphabetical => vec![
177                CharacterSequence::new(vec![
178                    "aábcčdďeěéfghiíjklmnňoópqrřsštťuúůvwxyýzž".to_string(),
179                    "AÁBCČDĎEĚÉFGHIÍJKLMNŇOÓPQRŘSŠTŤUÚŮVWXYÝZŽ".to_string(),
180                ])
181                .unwrap(),
182            ],
183        }
184    }
185}
186
187pub enum CyrillicSequenceData {
188    Alphabetical,
189}
190
191impl SequenceData for CyrillicSequenceData {
192    fn error_code(&self) -> &str {
193        match self {
194            CyrillicSequenceData::Alphabetical => "ILLEGAL_ALPHABETICAL_SEQUENCE",
195        }
196    }
197
198    fn get_sequences(&self) -> Vec<CharacterSequence> {
199        match self {
200            CyrillicSequenceData::Alphabetical => vec![
201                CharacterSequence::new(vec![
202                    "абвгдеёжзийклмнопрстуфхцчшщъыьэюяіѣѳѵ".to_string(),
203                    "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯІѢѲѴ".to_string(),
204                ])
205                .unwrap(),
206            ],
207        }
208    }
209}