1
2#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
4pub enum Tags {
5 LanguageTag,
7 TagSpace,
9 TagExclamationMark,
11 TagQuotationMark,
13 TagNumberSign,
15 TagDollarSign,
17 TagPercentSign,
19 TagAmpersand,
21 TagApostrophe,
23 TagLeftParenthesis,
25 TagRightParenthesis,
27 TagAsterisk,
29 TagPlusSign,
31 TagComma,
33 TagHyphenDashMinus,
35 TagFullStop,
37 TagSolidus,
39 TagDigitZero,
41 TagDigitOne,
43 TagDigitTwo,
45 TagDigitThree,
47 TagDigitFour,
49 TagDigitFive,
51 TagDigitSix,
53 TagDigitSeven,
55 TagDigitEight,
57 TagDigitNine,
59 TagColon,
61 TagSemicolon,
63 TagLessDashThanSign,
65 TagEqualsSign,
67 TagGreaterDashThanSign,
69 TagQuestionMark,
71 TagCommercialAt,
73 TagLatinCapitalLetterA,
75 TagLatinCapitalLetterB,
77 TagLatinCapitalLetterC,
79 TagLatinCapitalLetterD,
81 TagLatinCapitalLetterE,
83 TagLatinCapitalLetterF,
85 TagLatinCapitalLetterG,
87 TagLatinCapitalLetterH,
89 TagLatinCapitalLetterI,
91 TagLatinCapitalLetterJ,
93 TagLatinCapitalLetterK,
95 TagLatinCapitalLetterL,
97 TagLatinCapitalLetterM,
99 TagLatinCapitalLetterN,
101 TagLatinCapitalLetterO,
103 TagLatinCapitalLetterP,
105 TagLatinCapitalLetterQ,
107 TagLatinCapitalLetterR,
109 TagLatinCapitalLetterS,
111 TagLatinCapitalLetterT,
113 TagLatinCapitalLetterU,
115 TagLatinCapitalLetterV,
117 TagLatinCapitalLetterW,
119 TagLatinCapitalLetterX,
121 TagLatinCapitalLetterY,
123 TagLatinCapitalLetterZ,
125 TagLeftSquareBracket,
127 TagReverseSolidus,
129 TagRightSquareBracket,
131 TagCircumflexAccent,
133 TagLowLine,
135 TagGraveAccent,
137 TagLatinSmallLetterA,
139 TagLatinSmallLetterB,
141 TagLatinSmallLetterC,
143 TagLatinSmallLetterD,
145 TagLatinSmallLetterE,
147 TagLatinSmallLetterF,
149 TagLatinSmallLetterG,
151 TagLatinSmallLetterH,
153 TagLatinSmallLetterI,
155 TagLatinSmallLetterJ,
157 TagLatinSmallLetterK,
159 TagLatinSmallLetterL,
161 TagLatinSmallLetterM,
163 TagLatinSmallLetterN,
165 TagLatinSmallLetterO,
167 TagLatinSmallLetterP,
169 TagLatinSmallLetterQ,
171 TagLatinSmallLetterR,
173 TagLatinSmallLetterS,
175 TagLatinSmallLetterT,
177 TagLatinSmallLetterU,
179 TagLatinSmallLetterV,
181 TagLatinSmallLetterW,
183 TagLatinSmallLetterX,
185 TagLatinSmallLetterY,
187 TagLatinSmallLetterZ,
189 TagLeftCurlyBracket,
191 TagVerticalLine,
193 TagRightCurlyBracket,
195 TagTilde,
197}
198
199impl Into<char> for Tags {
200 fn into(self) -> char {
201 match self {
202 Tags::LanguageTag => '',
203 Tags::TagSpace => '',
204 Tags::TagExclamationMark => '',
205 Tags::TagQuotationMark => '',
206 Tags::TagNumberSign => '',
207 Tags::TagDollarSign => '',
208 Tags::TagPercentSign => '',
209 Tags::TagAmpersand => '',
210 Tags::TagApostrophe => '',
211 Tags::TagLeftParenthesis => '',
212 Tags::TagRightParenthesis => '',
213 Tags::TagAsterisk => '',
214 Tags::TagPlusSign => '',
215 Tags::TagComma => '',
216 Tags::TagHyphenDashMinus => '',
217 Tags::TagFullStop => '',
218 Tags::TagSolidus => '',
219 Tags::TagDigitZero => '',
220 Tags::TagDigitOne => '',
221 Tags::TagDigitTwo => '',
222 Tags::TagDigitThree => '',
223 Tags::TagDigitFour => '',
224 Tags::TagDigitFive => '',
225 Tags::TagDigitSix => '',
226 Tags::TagDigitSeven => '',
227 Tags::TagDigitEight => '',
228 Tags::TagDigitNine => '',
229 Tags::TagColon => '',
230 Tags::TagSemicolon => '',
231 Tags::TagLessDashThanSign => '',
232 Tags::TagEqualsSign => '',
233 Tags::TagGreaterDashThanSign => '',
234 Tags::TagQuestionMark => '',
235 Tags::TagCommercialAt => '',
236 Tags::TagLatinCapitalLetterA => '',
237 Tags::TagLatinCapitalLetterB => '',
238 Tags::TagLatinCapitalLetterC => '',
239 Tags::TagLatinCapitalLetterD => '',
240 Tags::TagLatinCapitalLetterE => '',
241 Tags::TagLatinCapitalLetterF => '',
242 Tags::TagLatinCapitalLetterG => '',
243 Tags::TagLatinCapitalLetterH => '',
244 Tags::TagLatinCapitalLetterI => '',
245 Tags::TagLatinCapitalLetterJ => '',
246 Tags::TagLatinCapitalLetterK => '',
247 Tags::TagLatinCapitalLetterL => '',
248 Tags::TagLatinCapitalLetterM => '',
249 Tags::TagLatinCapitalLetterN => '',
250 Tags::TagLatinCapitalLetterO => '',
251 Tags::TagLatinCapitalLetterP => '',
252 Tags::TagLatinCapitalLetterQ => '',
253 Tags::TagLatinCapitalLetterR => '',
254 Tags::TagLatinCapitalLetterS => '',
255 Tags::TagLatinCapitalLetterT => '',
256 Tags::TagLatinCapitalLetterU => '',
257 Tags::TagLatinCapitalLetterV => '',
258 Tags::TagLatinCapitalLetterW => '',
259 Tags::TagLatinCapitalLetterX => '',
260 Tags::TagLatinCapitalLetterY => '',
261 Tags::TagLatinCapitalLetterZ => '',
262 Tags::TagLeftSquareBracket => '',
263 Tags::TagReverseSolidus => '',
264 Tags::TagRightSquareBracket => '',
265 Tags::TagCircumflexAccent => '',
266 Tags::TagLowLine => '',
267 Tags::TagGraveAccent => '',
268 Tags::TagLatinSmallLetterA => '',
269 Tags::TagLatinSmallLetterB => '',
270 Tags::TagLatinSmallLetterC => '',
271 Tags::TagLatinSmallLetterD => '',
272 Tags::TagLatinSmallLetterE => '',
273 Tags::TagLatinSmallLetterF => '',
274 Tags::TagLatinSmallLetterG => '',
275 Tags::TagLatinSmallLetterH => '',
276 Tags::TagLatinSmallLetterI => '',
277 Tags::TagLatinSmallLetterJ => '',
278 Tags::TagLatinSmallLetterK => '',
279 Tags::TagLatinSmallLetterL => '',
280 Tags::TagLatinSmallLetterM => '',
281 Tags::TagLatinSmallLetterN => '',
282 Tags::TagLatinSmallLetterO => '',
283 Tags::TagLatinSmallLetterP => '',
284 Tags::TagLatinSmallLetterQ => '',
285 Tags::TagLatinSmallLetterR => '',
286 Tags::TagLatinSmallLetterS => '',
287 Tags::TagLatinSmallLetterT => '',
288 Tags::TagLatinSmallLetterU => '',
289 Tags::TagLatinSmallLetterV => '',
290 Tags::TagLatinSmallLetterW => '',
291 Tags::TagLatinSmallLetterX => '',
292 Tags::TagLatinSmallLetterY => '',
293 Tags::TagLatinSmallLetterZ => '',
294 Tags::TagLeftCurlyBracket => '',
295 Tags::TagVerticalLine => '',
296 Tags::TagRightCurlyBracket => '',
297 Tags::TagTilde => '',
298 }
299 }
300}
301
302impl std::convert::TryFrom<char> for Tags {
303 type Error = ();
304 fn try_from(c: char) -> Result<Self, Self::Error> {
305 match c {
306 '' => Ok(Tags::LanguageTag),
307 '' => Ok(Tags::TagSpace),
308 '' => Ok(Tags::TagExclamationMark),
309 '' => Ok(Tags::TagQuotationMark),
310 '' => Ok(Tags::TagNumberSign),
311 '' => Ok(Tags::TagDollarSign),
312 '' => Ok(Tags::TagPercentSign),
313 '' => Ok(Tags::TagAmpersand),
314 '' => Ok(Tags::TagApostrophe),
315 '' => Ok(Tags::TagLeftParenthesis),
316 '' => Ok(Tags::TagRightParenthesis),
317 '' => Ok(Tags::TagAsterisk),
318 '' => Ok(Tags::TagPlusSign),
319 '' => Ok(Tags::TagComma),
320 '' => Ok(Tags::TagHyphenDashMinus),
321 '' => Ok(Tags::TagFullStop),
322 '' => Ok(Tags::TagSolidus),
323 '' => Ok(Tags::TagDigitZero),
324 '' => Ok(Tags::TagDigitOne),
325 '' => Ok(Tags::TagDigitTwo),
326 '' => Ok(Tags::TagDigitThree),
327 '' => Ok(Tags::TagDigitFour),
328 '' => Ok(Tags::TagDigitFive),
329 '' => Ok(Tags::TagDigitSix),
330 '' => Ok(Tags::TagDigitSeven),
331 '' => Ok(Tags::TagDigitEight),
332 '' => Ok(Tags::TagDigitNine),
333 '' => Ok(Tags::TagColon),
334 '' => Ok(Tags::TagSemicolon),
335 '' => Ok(Tags::TagLessDashThanSign),
336 '' => Ok(Tags::TagEqualsSign),
337 '' => Ok(Tags::TagGreaterDashThanSign),
338 '' => Ok(Tags::TagQuestionMark),
339 '' => Ok(Tags::TagCommercialAt),
340 '' => Ok(Tags::TagLatinCapitalLetterA),
341 '' => Ok(Tags::TagLatinCapitalLetterB),
342 '' => Ok(Tags::TagLatinCapitalLetterC),
343 '' => Ok(Tags::TagLatinCapitalLetterD),
344 '' => Ok(Tags::TagLatinCapitalLetterE),
345 '' => Ok(Tags::TagLatinCapitalLetterF),
346 '' => Ok(Tags::TagLatinCapitalLetterG),
347 '' => Ok(Tags::TagLatinCapitalLetterH),
348 '' => Ok(Tags::TagLatinCapitalLetterI),
349 '' => Ok(Tags::TagLatinCapitalLetterJ),
350 '' => Ok(Tags::TagLatinCapitalLetterK),
351 '' => Ok(Tags::TagLatinCapitalLetterL),
352 '' => Ok(Tags::TagLatinCapitalLetterM),
353 '' => Ok(Tags::TagLatinCapitalLetterN),
354 '' => Ok(Tags::TagLatinCapitalLetterO),
355 '' => Ok(Tags::TagLatinCapitalLetterP),
356 '' => Ok(Tags::TagLatinCapitalLetterQ),
357 '' => Ok(Tags::TagLatinCapitalLetterR),
358 '' => Ok(Tags::TagLatinCapitalLetterS),
359 '' => Ok(Tags::TagLatinCapitalLetterT),
360 '' => Ok(Tags::TagLatinCapitalLetterU),
361 '' => Ok(Tags::TagLatinCapitalLetterV),
362 '' => Ok(Tags::TagLatinCapitalLetterW),
363 '' => Ok(Tags::TagLatinCapitalLetterX),
364 '' => Ok(Tags::TagLatinCapitalLetterY),
365 '' => Ok(Tags::TagLatinCapitalLetterZ),
366 '' => Ok(Tags::TagLeftSquareBracket),
367 '' => Ok(Tags::TagReverseSolidus),
368 '' => Ok(Tags::TagRightSquareBracket),
369 '' => Ok(Tags::TagCircumflexAccent),
370 '' => Ok(Tags::TagLowLine),
371 '' => Ok(Tags::TagGraveAccent),
372 '' => Ok(Tags::TagLatinSmallLetterA),
373 '' => Ok(Tags::TagLatinSmallLetterB),
374 '' => Ok(Tags::TagLatinSmallLetterC),
375 '' => Ok(Tags::TagLatinSmallLetterD),
376 '' => Ok(Tags::TagLatinSmallLetterE),
377 '' => Ok(Tags::TagLatinSmallLetterF),
378 '' => Ok(Tags::TagLatinSmallLetterG),
379 '' => Ok(Tags::TagLatinSmallLetterH),
380 '' => Ok(Tags::TagLatinSmallLetterI),
381 '' => Ok(Tags::TagLatinSmallLetterJ),
382 '' => Ok(Tags::TagLatinSmallLetterK),
383 '' => Ok(Tags::TagLatinSmallLetterL),
384 '' => Ok(Tags::TagLatinSmallLetterM),
385 '' => Ok(Tags::TagLatinSmallLetterN),
386 '' => Ok(Tags::TagLatinSmallLetterO),
387 '' => Ok(Tags::TagLatinSmallLetterP),
388 '' => Ok(Tags::TagLatinSmallLetterQ),
389 '' => Ok(Tags::TagLatinSmallLetterR),
390 '' => Ok(Tags::TagLatinSmallLetterS),
391 '' => Ok(Tags::TagLatinSmallLetterT),
392 '' => Ok(Tags::TagLatinSmallLetterU),
393 '' => Ok(Tags::TagLatinSmallLetterV),
394 '' => Ok(Tags::TagLatinSmallLetterW),
395 '' => Ok(Tags::TagLatinSmallLetterX),
396 '' => Ok(Tags::TagLatinSmallLetterY),
397 '' => Ok(Tags::TagLatinSmallLetterZ),
398 '' => Ok(Tags::TagLeftCurlyBracket),
399 '' => Ok(Tags::TagVerticalLine),
400 '' => Ok(Tags::TagRightCurlyBracket),
401 '' => Ok(Tags::TagTilde),
402 _ => Err(()),
403 }
404 }
405}
406
407impl Into<u32> for Tags {
408 fn into(self) -> u32 {
409 let c: char = self.into();
410 let hex = c
411 .escape_unicode()
412 .to_string()
413 .replace("\\u{", "")
414 .replace("}", "");
415 u32::from_str_radix(&hex, 16).unwrap()
416 }
417}
418
419impl std::convert::TryFrom<u32> for Tags {
420 type Error = ();
421 fn try_from(u: u32) -> Result<Self, Self::Error> {
422 if let Ok(c) = char::try_from(u) {
423 Self::try_from(c)
424 } else {
425 Err(())
426 }
427 }
428}
429
430impl Iterator for Tags {
431 type Item = Self;
432 fn next(&mut self) -> Option<Self> {
433 let index: u32 = (*self).into();
434 use std::convert::TryFrom;
435 Self::try_from(index + 1).ok()
436 }
437}
438
439impl Tags {
440 pub fn new() -> Self {
442 Tags::LanguageTag
443 }
444
445 pub fn name(&self) -> String {
447 let s = std::format!("Tags{:#?}", self);
448 string_morph::to_sentence_case(&s)
449 }
450}