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
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394

/// An enum to represent all characters in the PlayingCards block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum PlayingCards {
    /// \u{1f0a0}: '🂠'
    PlayingCardBack,
    /// \u{1f0a1}: '🂡'
    PlayingCardAceOfSpades,
    /// \u{1f0a2}: '🂢'
    PlayingCardTwoOfSpades,
    /// \u{1f0a3}: '🂣'
    PlayingCardThreeOfSpades,
    /// \u{1f0a4}: '🂤'
    PlayingCardFourOfSpades,
    /// \u{1f0a5}: '🂥'
    PlayingCardFiveOfSpades,
    /// \u{1f0a6}: '🂦'
    PlayingCardSixOfSpades,
    /// \u{1f0a7}: '🂧'
    PlayingCardSevenOfSpades,
    /// \u{1f0a8}: '🂨'
    PlayingCardEightOfSpades,
    /// \u{1f0a9}: '🂩'
    PlayingCardNineOfSpades,
    /// \u{1f0aa}: '🂪'
    PlayingCardTenOfSpades,
    /// \u{1f0ab}: '🂫'
    PlayingCardJackOfSpades,
    /// \u{1f0ac}: '🂬'
    PlayingCardKnightOfSpades,
    /// \u{1f0ad}: '🂭'
    PlayingCardQueenOfSpades,
    /// \u{1f0ae}: '🂮'
    PlayingCardKingOfSpades,
    /// \u{1f0b1}: '🂱'
    PlayingCardAceOfHearts,
    /// \u{1f0b2}: '🂲'
    PlayingCardTwoOfHearts,
    /// \u{1f0b3}: '🂳'
    PlayingCardThreeOfHearts,
    /// \u{1f0b4}: '🂴'
    PlayingCardFourOfHearts,
    /// \u{1f0b5}: '🂵'
    PlayingCardFiveOfHearts,
    /// \u{1f0b6}: '🂶'
    PlayingCardSixOfHearts,
    /// \u{1f0b7}: '🂷'
    PlayingCardSevenOfHearts,
    /// \u{1f0b8}: '🂸'
    PlayingCardEightOfHearts,
    /// \u{1f0b9}: '🂹'
    PlayingCardNineOfHearts,
    /// \u{1f0ba}: '🂺'
    PlayingCardTenOfHearts,
    /// \u{1f0bb}: '🂻'
    PlayingCardJackOfHearts,
    /// \u{1f0bc}: '🂼'
    PlayingCardKnightOfHearts,
    /// \u{1f0bd}: '🂽'
    PlayingCardQueenOfHearts,
    /// \u{1f0be}: '🂾'
    PlayingCardKingOfHearts,
    /// \u{1f0bf}: '🂿'
    PlayingCardRedJoker,
    /// \u{1f0c1}: '🃁'
    PlayingCardAceOfDiamonds,
    /// \u{1f0c2}: '🃂'
    PlayingCardTwoOfDiamonds,
    /// \u{1f0c3}: '🃃'
    PlayingCardThreeOfDiamonds,
    /// \u{1f0c4}: '🃄'
    PlayingCardFourOfDiamonds,
    /// \u{1f0c5}: '🃅'
    PlayingCardFiveOfDiamonds,
    /// \u{1f0c6}: '🃆'
    PlayingCardSixOfDiamonds,
    /// \u{1f0c7}: '🃇'
    PlayingCardSevenOfDiamonds,
    /// \u{1f0c8}: '🃈'
    PlayingCardEightOfDiamonds,
    /// \u{1f0c9}: '🃉'
    PlayingCardNineOfDiamonds,
    /// \u{1f0ca}: '🃊'
    PlayingCardTenOfDiamonds,
    /// \u{1f0cb}: '🃋'
    PlayingCardJackOfDiamonds,
    /// \u{1f0cc}: '🃌'
    PlayingCardKnightOfDiamonds,
    /// \u{1f0cd}: '🃍'
    PlayingCardQueenOfDiamonds,
    /// \u{1f0ce}: '🃎'
    PlayingCardKingOfDiamonds,
    /// \u{1f0cf}: '🃏'
    PlayingCardBlackJoker,
    /// \u{1f0d1}: '🃑'
    PlayingCardAceOfClubs,
    /// \u{1f0d2}: '🃒'
    PlayingCardTwoOfClubs,
    /// \u{1f0d3}: '🃓'
    PlayingCardThreeOfClubs,
    /// \u{1f0d4}: '🃔'
    PlayingCardFourOfClubs,
    /// \u{1f0d5}: '🃕'
    PlayingCardFiveOfClubs,
    /// \u{1f0d6}: '🃖'
    PlayingCardSixOfClubs,
    /// \u{1f0d7}: '🃗'
    PlayingCardSevenOfClubs,
    /// \u{1f0d8}: '🃘'
    PlayingCardEightOfClubs,
    /// \u{1f0d9}: '🃙'
    PlayingCardNineOfClubs,
    /// \u{1f0da}: '🃚'
    PlayingCardTenOfClubs,
    /// \u{1f0db}: '🃛'
    PlayingCardJackOfClubs,
    /// \u{1f0dc}: '🃜'
    PlayingCardKnightOfClubs,
    /// \u{1f0dd}: '🃝'
    PlayingCardQueenOfClubs,
    /// \u{1f0de}: '🃞'
    PlayingCardKingOfClubs,
    /// \u{1f0df}: '🃟'
    PlayingCardWhiteJoker,
    /// \u{1f0e0}: '🃠'
    PlayingCardFool,
    /// \u{1f0e1}: '🃡'
    PlayingCardTrumpDash1,
    /// \u{1f0e2}: '🃢'
    PlayingCardTrumpDash2,
    /// \u{1f0e3}: '🃣'
    PlayingCardTrumpDash3,
    /// \u{1f0e4}: '🃤'
    PlayingCardTrumpDash4,
    /// \u{1f0e5}: '🃥'
    PlayingCardTrumpDash5,
    /// \u{1f0e6}: '🃦'
    PlayingCardTrumpDash6,
    /// \u{1f0e7}: '🃧'
    PlayingCardTrumpDash7,
    /// \u{1f0e8}: '🃨'
    PlayingCardTrumpDash8,
    /// \u{1f0e9}: '🃩'
    PlayingCardTrumpDash9,
    /// \u{1f0ea}: '🃪'
    PlayingCardTrumpDash10,
    /// \u{1f0eb}: '🃫'
    PlayingCardTrumpDash11,
    /// \u{1f0ec}: '🃬'
    PlayingCardTrumpDash12,
    /// \u{1f0ed}: '🃭'
    PlayingCardTrumpDash13,
    /// \u{1f0ee}: '🃮'
    PlayingCardTrumpDash14,
    /// \u{1f0ef}: '🃯'
    PlayingCardTrumpDash15,
    /// \u{1f0f0}: '🃰'
    PlayingCardTrumpDash16,
    /// \u{1f0f1}: '🃱'
    PlayingCardTrumpDash17,
    /// \u{1f0f2}: '🃲'
    PlayingCardTrumpDash18,
    /// \u{1f0f3}: '🃳'
    PlayingCardTrumpDash19,
    /// \u{1f0f4}: '🃴'
    PlayingCardTrumpDash20,
    /// \u{1f0f5}: '🃵'
    PlayingCardTrumpDash21,
}

impl Into<char> for PlayingCards {
    fn into(self) -> char {
        match self {
            PlayingCards::PlayingCardBack => '🂠',
            PlayingCards::PlayingCardAceOfSpades => '🂡',
            PlayingCards::PlayingCardTwoOfSpades => '🂢',
            PlayingCards::PlayingCardThreeOfSpades => '🂣',
            PlayingCards::PlayingCardFourOfSpades => '🂤',
            PlayingCards::PlayingCardFiveOfSpades => '🂥',
            PlayingCards::PlayingCardSixOfSpades => '🂦',
            PlayingCards::PlayingCardSevenOfSpades => '🂧',
            PlayingCards::PlayingCardEightOfSpades => '🂨',
            PlayingCards::PlayingCardNineOfSpades => '🂩',
            PlayingCards::PlayingCardTenOfSpades => '🂪',
            PlayingCards::PlayingCardJackOfSpades => '🂫',
            PlayingCards::PlayingCardKnightOfSpades => '🂬',
            PlayingCards::PlayingCardQueenOfSpades => '🂭',
            PlayingCards::PlayingCardKingOfSpades => '🂮',
            PlayingCards::PlayingCardAceOfHearts => '🂱',
            PlayingCards::PlayingCardTwoOfHearts => '🂲',
            PlayingCards::PlayingCardThreeOfHearts => '🂳',
            PlayingCards::PlayingCardFourOfHearts => '🂴',
            PlayingCards::PlayingCardFiveOfHearts => '🂵',
            PlayingCards::PlayingCardSixOfHearts => '🂶',
            PlayingCards::PlayingCardSevenOfHearts => '🂷',
            PlayingCards::PlayingCardEightOfHearts => '🂸',
            PlayingCards::PlayingCardNineOfHearts => '🂹',
            PlayingCards::PlayingCardTenOfHearts => '🂺',
            PlayingCards::PlayingCardJackOfHearts => '🂻',
            PlayingCards::PlayingCardKnightOfHearts => '🂼',
            PlayingCards::PlayingCardQueenOfHearts => '🂽',
            PlayingCards::PlayingCardKingOfHearts => '🂾',
            PlayingCards::PlayingCardRedJoker => '🂿',
            PlayingCards::PlayingCardAceOfDiamonds => '🃁',
            PlayingCards::PlayingCardTwoOfDiamonds => '🃂',
            PlayingCards::PlayingCardThreeOfDiamonds => '🃃',
            PlayingCards::PlayingCardFourOfDiamonds => '🃄',
            PlayingCards::PlayingCardFiveOfDiamonds => '🃅',
            PlayingCards::PlayingCardSixOfDiamonds => '🃆',
            PlayingCards::PlayingCardSevenOfDiamonds => '🃇',
            PlayingCards::PlayingCardEightOfDiamonds => '🃈',
            PlayingCards::PlayingCardNineOfDiamonds => '🃉',
            PlayingCards::PlayingCardTenOfDiamonds => '🃊',
            PlayingCards::PlayingCardJackOfDiamonds => '🃋',
            PlayingCards::PlayingCardKnightOfDiamonds => '🃌',
            PlayingCards::PlayingCardQueenOfDiamonds => '🃍',
            PlayingCards::PlayingCardKingOfDiamonds => '🃎',
            PlayingCards::PlayingCardBlackJoker => '🃏',
            PlayingCards::PlayingCardAceOfClubs => '🃑',
            PlayingCards::PlayingCardTwoOfClubs => '🃒',
            PlayingCards::PlayingCardThreeOfClubs => '🃓',
            PlayingCards::PlayingCardFourOfClubs => '🃔',
            PlayingCards::PlayingCardFiveOfClubs => '🃕',
            PlayingCards::PlayingCardSixOfClubs => '🃖',
            PlayingCards::PlayingCardSevenOfClubs => '🃗',
            PlayingCards::PlayingCardEightOfClubs => '🃘',
            PlayingCards::PlayingCardNineOfClubs => '🃙',
            PlayingCards::PlayingCardTenOfClubs => '🃚',
            PlayingCards::PlayingCardJackOfClubs => '🃛',
            PlayingCards::PlayingCardKnightOfClubs => '🃜',
            PlayingCards::PlayingCardQueenOfClubs => '🃝',
            PlayingCards::PlayingCardKingOfClubs => '🃞',
            PlayingCards::PlayingCardWhiteJoker => '🃟',
            PlayingCards::PlayingCardFool => '🃠',
            PlayingCards::PlayingCardTrumpDash1 => '🃡',
            PlayingCards::PlayingCardTrumpDash2 => '🃢',
            PlayingCards::PlayingCardTrumpDash3 => '🃣',
            PlayingCards::PlayingCardTrumpDash4 => '🃤',
            PlayingCards::PlayingCardTrumpDash5 => '🃥',
            PlayingCards::PlayingCardTrumpDash6 => '🃦',
            PlayingCards::PlayingCardTrumpDash7 => '🃧',
            PlayingCards::PlayingCardTrumpDash8 => '🃨',
            PlayingCards::PlayingCardTrumpDash9 => '🃩',
            PlayingCards::PlayingCardTrumpDash10 => '🃪',
            PlayingCards::PlayingCardTrumpDash11 => '🃫',
            PlayingCards::PlayingCardTrumpDash12 => '🃬',
            PlayingCards::PlayingCardTrumpDash13 => '🃭',
            PlayingCards::PlayingCardTrumpDash14 => '🃮',
            PlayingCards::PlayingCardTrumpDash15 => '🃯',
            PlayingCards::PlayingCardTrumpDash16 => '🃰',
            PlayingCards::PlayingCardTrumpDash17 => '🃱',
            PlayingCards::PlayingCardTrumpDash18 => '🃲',
            PlayingCards::PlayingCardTrumpDash19 => '🃳',
            PlayingCards::PlayingCardTrumpDash20 => '🃴',
            PlayingCards::PlayingCardTrumpDash21 => '🃵',
        }
    }
}

impl std::convert::TryFrom<char> for PlayingCards {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        match c {
            '🂠' => Ok(PlayingCards::PlayingCardBack),
            '🂡' => Ok(PlayingCards::PlayingCardAceOfSpades),
            '🂢' => Ok(PlayingCards::PlayingCardTwoOfSpades),
            '🂣' => Ok(PlayingCards::PlayingCardThreeOfSpades),
            '🂤' => Ok(PlayingCards::PlayingCardFourOfSpades),
            '🂥' => Ok(PlayingCards::PlayingCardFiveOfSpades),
            '🂦' => Ok(PlayingCards::PlayingCardSixOfSpades),
            '🂧' => Ok(PlayingCards::PlayingCardSevenOfSpades),
            '🂨' => Ok(PlayingCards::PlayingCardEightOfSpades),
            '🂩' => Ok(PlayingCards::PlayingCardNineOfSpades),
            '🂪' => Ok(PlayingCards::PlayingCardTenOfSpades),
            '🂫' => Ok(PlayingCards::PlayingCardJackOfSpades),
            '🂬' => Ok(PlayingCards::PlayingCardKnightOfSpades),
            '🂭' => Ok(PlayingCards::PlayingCardQueenOfSpades),
            '🂮' => Ok(PlayingCards::PlayingCardKingOfSpades),
            '🂱' => Ok(PlayingCards::PlayingCardAceOfHearts),
            '🂲' => Ok(PlayingCards::PlayingCardTwoOfHearts),
            '🂳' => Ok(PlayingCards::PlayingCardThreeOfHearts),
            '🂴' => Ok(PlayingCards::PlayingCardFourOfHearts),
            '🂵' => Ok(PlayingCards::PlayingCardFiveOfHearts),
            '🂶' => Ok(PlayingCards::PlayingCardSixOfHearts),
            '🂷' => Ok(PlayingCards::PlayingCardSevenOfHearts),
            '🂸' => Ok(PlayingCards::PlayingCardEightOfHearts),
            '🂹' => Ok(PlayingCards::PlayingCardNineOfHearts),
            '🂺' => Ok(PlayingCards::PlayingCardTenOfHearts),
            '🂻' => Ok(PlayingCards::PlayingCardJackOfHearts),
            '🂼' => Ok(PlayingCards::PlayingCardKnightOfHearts),
            '🂽' => Ok(PlayingCards::PlayingCardQueenOfHearts),
            '🂾' => Ok(PlayingCards::PlayingCardKingOfHearts),
            '🂿' => Ok(PlayingCards::PlayingCardRedJoker),
            '🃁' => Ok(PlayingCards::PlayingCardAceOfDiamonds),
            '🃂' => Ok(PlayingCards::PlayingCardTwoOfDiamonds),
            '🃃' => Ok(PlayingCards::PlayingCardThreeOfDiamonds),
            '🃄' => Ok(PlayingCards::PlayingCardFourOfDiamonds),
            '🃅' => Ok(PlayingCards::PlayingCardFiveOfDiamonds),
            '🃆' => Ok(PlayingCards::PlayingCardSixOfDiamonds),
            '🃇' => Ok(PlayingCards::PlayingCardSevenOfDiamonds),
            '🃈' => Ok(PlayingCards::PlayingCardEightOfDiamonds),
            '🃉' => Ok(PlayingCards::PlayingCardNineOfDiamonds),
            '🃊' => Ok(PlayingCards::PlayingCardTenOfDiamonds),
            '🃋' => Ok(PlayingCards::PlayingCardJackOfDiamonds),
            '🃌' => Ok(PlayingCards::PlayingCardKnightOfDiamonds),
            '🃍' => Ok(PlayingCards::PlayingCardQueenOfDiamonds),
            '🃎' => Ok(PlayingCards::PlayingCardKingOfDiamonds),
            '🃏' => Ok(PlayingCards::PlayingCardBlackJoker),
            '🃑' => Ok(PlayingCards::PlayingCardAceOfClubs),
            '🃒' => Ok(PlayingCards::PlayingCardTwoOfClubs),
            '🃓' => Ok(PlayingCards::PlayingCardThreeOfClubs),
            '🃔' => Ok(PlayingCards::PlayingCardFourOfClubs),
            '🃕' => Ok(PlayingCards::PlayingCardFiveOfClubs),
            '🃖' => Ok(PlayingCards::PlayingCardSixOfClubs),
            '🃗' => Ok(PlayingCards::PlayingCardSevenOfClubs),
            '🃘' => Ok(PlayingCards::PlayingCardEightOfClubs),
            '🃙' => Ok(PlayingCards::PlayingCardNineOfClubs),
            '🃚' => Ok(PlayingCards::PlayingCardTenOfClubs),
            '🃛' => Ok(PlayingCards::PlayingCardJackOfClubs),
            '🃜' => Ok(PlayingCards::PlayingCardKnightOfClubs),
            '🃝' => Ok(PlayingCards::PlayingCardQueenOfClubs),
            '🃞' => Ok(PlayingCards::PlayingCardKingOfClubs),
            '🃟' => Ok(PlayingCards::PlayingCardWhiteJoker),
            '🃠' => Ok(PlayingCards::PlayingCardFool),
            '🃡' => Ok(PlayingCards::PlayingCardTrumpDash1),
            '🃢' => Ok(PlayingCards::PlayingCardTrumpDash2),
            '🃣' => Ok(PlayingCards::PlayingCardTrumpDash3),
            '🃤' => Ok(PlayingCards::PlayingCardTrumpDash4),
            '🃥' => Ok(PlayingCards::PlayingCardTrumpDash5),
            '🃦' => Ok(PlayingCards::PlayingCardTrumpDash6),
            '🃧' => Ok(PlayingCards::PlayingCardTrumpDash7),
            '🃨' => Ok(PlayingCards::PlayingCardTrumpDash8),
            '🃩' => Ok(PlayingCards::PlayingCardTrumpDash9),
            '🃪' => Ok(PlayingCards::PlayingCardTrumpDash10),
            '🃫' => Ok(PlayingCards::PlayingCardTrumpDash11),
            '🃬' => Ok(PlayingCards::PlayingCardTrumpDash12),
            '🃭' => Ok(PlayingCards::PlayingCardTrumpDash13),
            '🃮' => Ok(PlayingCards::PlayingCardTrumpDash14),
            '🃯' => Ok(PlayingCards::PlayingCardTrumpDash15),
            '🃰' => Ok(PlayingCards::PlayingCardTrumpDash16),
            '🃱' => Ok(PlayingCards::PlayingCardTrumpDash17),
            '🃲' => Ok(PlayingCards::PlayingCardTrumpDash18),
            '🃳' => Ok(PlayingCards::PlayingCardTrumpDash19),
            '🃴' => Ok(PlayingCards::PlayingCardTrumpDash20),
            '🃵' => Ok(PlayingCards::PlayingCardTrumpDash21),
            _ => Err(()),
        }
    }
}

impl Into<u32> for PlayingCards {
    fn into(self) -> u32 {
        let c: char = self.into();
        let hex = c
            .escape_unicode()
            .to_string()
            .replace("\\u{", "")
            .replace("}", "");
        u32::from_str_radix(&hex, 16).unwrap()
    }
}

impl std::convert::TryFrom<u32> for PlayingCards {
    type Error = ();
    fn try_from(u: u32) -> Result<Self, Self::Error> {
        if let Ok(c) = char::try_from(u) {
            Self::try_from(c)
        } else {
            Err(())
        }
    }
}

impl Iterator for PlayingCards {
    type Item = Self;
    fn next(&mut self) -> Option<Self> {
        let index: u32 = (*self).into();
        use std::convert::TryFrom;
        Self::try_from(index + 1).ok()
    }
}

impl PlayingCards {
    /// The character with the lowest index in this unicode block
    pub fn new() -> Self {
        PlayingCards::PlayingCardBack
    }

    /// The character's name, in sentence case
    pub fn name(&self) -> String {
        let s = std::format!("PlayingCards{:#?}", self);
        string_morph::to_sentence_case(&s)
    }
}