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
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574

/// An enum to represent all characters in the BoxDrawing block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum BoxDrawing {
    /// \u{2500}: '─'
    LightHorizontal,
    /// \u{2501}: '━'
    HeavyHorizontal,
    /// \u{2502}: '│'
    LightVertical,
    /// \u{2503}: '┃'
    HeavyVertical,
    /// \u{2504}: '┄'
    LightTripleDashHorizontal,
    /// \u{2505}: '┅'
    HeavyTripleDashHorizontal,
    /// \u{2506}: '┆'
    LightTripleDashVertical,
    /// \u{2507}: '┇'
    HeavyTripleDashVertical,
    /// \u{2508}: '┈'
    LightQuadrupleDashHorizontal,
    /// \u{2509}: '┉'
    HeavyQuadrupleDashHorizontal,
    /// \u{250a}: '┊'
    LightQuadrupleDashVertical,
    /// \u{250b}: '┋'
    HeavyQuadrupleDashVertical,
    /// \u{250c}: '┌'
    LightDownAndRight,
    /// \u{250d}: '┍'
    DownLightAndRightHeavy,
    /// \u{250e}: '┎'
    DownHeavyAndRightLight,
    /// \u{250f}: '┏'
    HeavyDownAndRight,
    /// \u{2510}: '┐'
    LightDownAndLeft,
    /// \u{2511}: '┑'
    DownLightAndLeftHeavy,
    /// \u{2512}: '┒'
    DownHeavyAndLeftLight,
    /// \u{2513}: '┓'
    HeavyDownAndLeft,
    /// \u{2514}: '└'
    LightUpAndRight,
    /// \u{2515}: '┕'
    UpLightAndRightHeavy,
    /// \u{2516}: '┖'
    UpHeavyAndRightLight,
    /// \u{2517}: '┗'
    HeavyUpAndRight,
    /// \u{2518}: '┘'
    LightUpAndLeft,
    /// \u{2519}: '┙'
    UpLightAndLeftHeavy,
    /// \u{251a}: '┚'
    UpHeavyAndLeftLight,
    /// \u{251b}: '┛'
    HeavyUpAndLeft,
    /// \u{251c}: '├'
    LightVerticalAndRight,
    /// \u{251d}: '┝'
    VerticalLightAndRightHeavy,
    /// \u{251e}: '┞'
    UpHeavyAndRightDownLight,
    /// \u{251f}: '┟'
    DownHeavyAndRightUpLight,
    /// \u{2520}: '┠'
    VerticalHeavyAndRightLight,
    /// \u{2521}: '┡'
    DownLightAndRightUpHeavy,
    /// \u{2522}: '┢'
    UpLightAndRightDownHeavy,
    /// \u{2523}: '┣'
    HeavyVerticalAndRight,
    /// \u{2524}: '┤'
    LightVerticalAndLeft,
    /// \u{2525}: '┥'
    VerticalLightAndLeftHeavy,
    /// \u{2526}: '┦'
    UpHeavyAndLeftDownLight,
    /// \u{2527}: '┧'
    DownHeavyAndLeftUpLight,
    /// \u{2528}: '┨'
    VerticalHeavyAndLeftLight,
    /// \u{2529}: '┩'
    DownLightAndLeftUpHeavy,
    /// \u{252a}: '┪'
    UpLightAndLeftDownHeavy,
    /// \u{252b}: '┫'
    HeavyVerticalAndLeft,
    /// \u{252c}: '┬'
    LightDownAndHorizontal,
    /// \u{252d}: '┭'
    LeftHeavyAndRightDownLight,
    /// \u{252e}: '┮'
    RightHeavyAndLeftDownLight,
    /// \u{252f}: '┯'
    DownLightAndHorizontalHeavy,
    /// \u{2530}: '┰'
    DownHeavyAndHorizontalLight,
    /// \u{2531}: '┱'
    RightLightAndLeftDownHeavy,
    /// \u{2532}: '┲'
    LeftLightAndRightDownHeavy,
    /// \u{2533}: '┳'
    HeavyDownAndHorizontal,
    /// \u{2534}: '┴'
    LightUpAndHorizontal,
    /// \u{2535}: '┵'
    LeftHeavyAndRightUpLight,
    /// \u{2536}: '┶'
    RightHeavyAndLeftUpLight,
    /// \u{2537}: '┷'
    UpLightAndHorizontalHeavy,
    /// \u{2538}: '┸'
    UpHeavyAndHorizontalLight,
    /// \u{2539}: '┹'
    RightLightAndLeftUpHeavy,
    /// \u{253a}: '┺'
    LeftLightAndRightUpHeavy,
    /// \u{253b}: '┻'
    HeavyUpAndHorizontal,
    /// \u{253c}: '┼'
    LightVerticalAndHorizontal,
    /// \u{253d}: '┽'
    LeftHeavyAndRightVerticalLight,
    /// \u{253e}: '┾'
    RightHeavyAndLeftVerticalLight,
    /// \u{253f}: '┿'
    VerticalLightAndHorizontalHeavy,
    /// \u{2540}: '╀'
    UpHeavyAndDownHorizontalLight,
    /// \u{2541}: '╁'
    DownHeavyAndUpHorizontalLight,
    /// \u{2542}: '╂'
    VerticalHeavyAndHorizontalLight,
    /// \u{2543}: '╃'
    LeftUpHeavyAndRightDownLight,
    /// \u{2544}: '╄'
    RightUpHeavyAndLeftDownLight,
    /// \u{2545}: '╅'
    LeftDownHeavyAndRightUpLight,
    /// \u{2546}: '╆'
    RightDownHeavyAndLeftUpLight,
    /// \u{2547}: '╇'
    DownLightAndUpHorizontalHeavy,
    /// \u{2548}: '╈'
    UpLightAndDownHorizontalHeavy,
    /// \u{2549}: '╉'
    RightLightAndLeftVerticalHeavy,
    /// \u{254a}: '╊'
    LeftLightAndRightVerticalHeavy,
    /// \u{254b}: '╋'
    HeavyVerticalAndHorizontal,
    /// \u{254c}: '╌'
    LightDoubleDashHorizontal,
    /// \u{254d}: '╍'
    HeavyDoubleDashHorizontal,
    /// \u{254e}: '╎'
    LightDoubleDashVertical,
    /// \u{254f}: '╏'
    HeavyDoubleDashVertical,
    /// \u{2550}: '═'
    DoubleHorizontal,
    /// \u{2551}: '║'
    DoubleVertical,
    /// \u{2552}: '╒'
    DownSingleAndRightDouble,
    /// \u{2553}: '╓'
    DownDoubleAndRightSingle,
    /// \u{2554}: '╔'
    DoubleDownAndRight,
    /// \u{2555}: '╕'
    DownSingleAndLeftDouble,
    /// \u{2556}: '╖'
    DownDoubleAndLeftSingle,
    /// \u{2557}: '╗'
    DoubleDownAndLeft,
    /// \u{2558}: '╘'
    UpSingleAndRightDouble,
    /// \u{2559}: '╙'
    UpDoubleAndRightSingle,
    /// \u{255a}: '╚'
    DoubleUpAndRight,
    /// \u{255b}: '╛'
    UpSingleAndLeftDouble,
    /// \u{255c}: '╜'
    UpDoubleAndLeftSingle,
    /// \u{255d}: '╝'
    DoubleUpAndLeft,
    /// \u{255e}: '╞'
    VerticalSingleAndRightDouble,
    /// \u{255f}: '╟'
    VerticalDoubleAndRightSingle,
    /// \u{2560}: '╠'
    DoubleVerticalAndRight,
    /// \u{2561}: '╡'
    VerticalSingleAndLeftDouble,
    /// \u{2562}: '╢'
    VerticalDoubleAndLeftSingle,
    /// \u{2563}: '╣'
    DoubleVerticalAndLeft,
    /// \u{2564}: '╤'
    DownSingleAndHorizontalDouble,
    /// \u{2565}: '╥'
    DownDoubleAndHorizontalSingle,
    /// \u{2566}: '╦'
    DoubleDownAndHorizontal,
    /// \u{2567}: '╧'
    UpSingleAndHorizontalDouble,
    /// \u{2568}: '╨'
    UpDoubleAndHorizontalSingle,
    /// \u{2569}: '╩'
    DoubleUpAndHorizontal,
    /// \u{256a}: '╪'
    VerticalSingleAndHorizontalDouble,
    /// \u{256b}: '╫'
    VerticalDoubleAndHorizontalSingle,
    /// \u{256c}: '╬'
    DoubleVerticalAndHorizontal,
    /// \u{256d}: '╭'
    LightArcDownAndRight,
    /// \u{256e}: '╮'
    LightArcDownAndLeft,
    /// \u{256f}: '╯'
    LightArcUpAndLeft,
    /// \u{2570}: '╰'
    LightArcUpAndRight,
    /// \u{2571}: '╱'
    LightDiagonalUpperRightToLowerLeft,
    /// \u{2572}: '╲'
    LightDiagonalUpperLeftToLowerRight,
    /// \u{2573}: '╳'
    LightDiagonalCross,
    /// \u{2574}: '╴'
    LightLeft,
    /// \u{2575}: '╵'
    LightUp,
    /// \u{2576}: '╶'
    LightRight,
    /// \u{2577}: '╷'
    LightDown,
    /// \u{2578}: '╸'
    HeavyLeft,
    /// \u{2579}: '╹'
    HeavyUp,
    /// \u{257a}: '╺'
    HeavyRight,
    /// \u{257b}: '╻'
    HeavyDown,
    /// \u{257c}: '╼'
    LightLeftAndHeavyRight,
    /// \u{257d}: '╽'
    LightUpAndHeavyDown,
    /// \u{257e}: '╾'
    HeavyLeftAndLightRight,
}

impl Into<char> for BoxDrawing {
    fn into(self) -> char {
        match self {
            BoxDrawing::LightHorizontal => '─',
            BoxDrawing::HeavyHorizontal => '━',
            BoxDrawing::LightVertical => '│',
            BoxDrawing::HeavyVertical => '┃',
            BoxDrawing::LightTripleDashHorizontal => '┄',
            BoxDrawing::HeavyTripleDashHorizontal => '┅',
            BoxDrawing::LightTripleDashVertical => '┆',
            BoxDrawing::HeavyTripleDashVertical => '┇',
            BoxDrawing::LightQuadrupleDashHorizontal => '┈',
            BoxDrawing::HeavyQuadrupleDashHorizontal => '┉',
            BoxDrawing::LightQuadrupleDashVertical => '┊',
            BoxDrawing::HeavyQuadrupleDashVertical => '┋',
            BoxDrawing::LightDownAndRight => '┌',
            BoxDrawing::DownLightAndRightHeavy => '┍',
            BoxDrawing::DownHeavyAndRightLight => '┎',
            BoxDrawing::HeavyDownAndRight => '┏',
            BoxDrawing::LightDownAndLeft => '┐',
            BoxDrawing::DownLightAndLeftHeavy => '┑',
            BoxDrawing::DownHeavyAndLeftLight => '┒',
            BoxDrawing::HeavyDownAndLeft => '┓',
            BoxDrawing::LightUpAndRight => '└',
            BoxDrawing::UpLightAndRightHeavy => '┕',
            BoxDrawing::UpHeavyAndRightLight => '┖',
            BoxDrawing::HeavyUpAndRight => '┗',
            BoxDrawing::LightUpAndLeft => '┘',
            BoxDrawing::UpLightAndLeftHeavy => '┙',
            BoxDrawing::UpHeavyAndLeftLight => '┚',
            BoxDrawing::HeavyUpAndLeft => '┛',
            BoxDrawing::LightVerticalAndRight => '├',
            BoxDrawing::VerticalLightAndRightHeavy => '┝',
            BoxDrawing::UpHeavyAndRightDownLight => '┞',
            BoxDrawing::DownHeavyAndRightUpLight => '┟',
            BoxDrawing::VerticalHeavyAndRightLight => '┠',
            BoxDrawing::DownLightAndRightUpHeavy => '┡',
            BoxDrawing::UpLightAndRightDownHeavy => '┢',
            BoxDrawing::HeavyVerticalAndRight => '┣',
            BoxDrawing::LightVerticalAndLeft => '┤',
            BoxDrawing::VerticalLightAndLeftHeavy => '┥',
            BoxDrawing::UpHeavyAndLeftDownLight => '┦',
            BoxDrawing::DownHeavyAndLeftUpLight => '┧',
            BoxDrawing::VerticalHeavyAndLeftLight => '┨',
            BoxDrawing::DownLightAndLeftUpHeavy => '┩',
            BoxDrawing::UpLightAndLeftDownHeavy => '┪',
            BoxDrawing::HeavyVerticalAndLeft => '┫',
            BoxDrawing::LightDownAndHorizontal => '┬',
            BoxDrawing::LeftHeavyAndRightDownLight => '┭',
            BoxDrawing::RightHeavyAndLeftDownLight => '┮',
            BoxDrawing::DownLightAndHorizontalHeavy => '┯',
            BoxDrawing::DownHeavyAndHorizontalLight => '┰',
            BoxDrawing::RightLightAndLeftDownHeavy => '┱',
            BoxDrawing::LeftLightAndRightDownHeavy => '┲',
            BoxDrawing::HeavyDownAndHorizontal => '┳',
            BoxDrawing::LightUpAndHorizontal => '┴',
            BoxDrawing::LeftHeavyAndRightUpLight => '┵',
            BoxDrawing::RightHeavyAndLeftUpLight => '┶',
            BoxDrawing::UpLightAndHorizontalHeavy => '┷',
            BoxDrawing::UpHeavyAndHorizontalLight => '┸',
            BoxDrawing::RightLightAndLeftUpHeavy => '┹',
            BoxDrawing::LeftLightAndRightUpHeavy => '┺',
            BoxDrawing::HeavyUpAndHorizontal => '┻',
            BoxDrawing::LightVerticalAndHorizontal => '┼',
            BoxDrawing::LeftHeavyAndRightVerticalLight => '┽',
            BoxDrawing::RightHeavyAndLeftVerticalLight => '┾',
            BoxDrawing::VerticalLightAndHorizontalHeavy => '┿',
            BoxDrawing::UpHeavyAndDownHorizontalLight => '╀',
            BoxDrawing::DownHeavyAndUpHorizontalLight => '╁',
            BoxDrawing::VerticalHeavyAndHorizontalLight => '╂',
            BoxDrawing::LeftUpHeavyAndRightDownLight => '╃',
            BoxDrawing::RightUpHeavyAndLeftDownLight => '╄',
            BoxDrawing::LeftDownHeavyAndRightUpLight => '╅',
            BoxDrawing::RightDownHeavyAndLeftUpLight => '╆',
            BoxDrawing::DownLightAndUpHorizontalHeavy => '╇',
            BoxDrawing::UpLightAndDownHorizontalHeavy => '╈',
            BoxDrawing::RightLightAndLeftVerticalHeavy => '╉',
            BoxDrawing::LeftLightAndRightVerticalHeavy => '╊',
            BoxDrawing::HeavyVerticalAndHorizontal => '╋',
            BoxDrawing::LightDoubleDashHorizontal => '╌',
            BoxDrawing::HeavyDoubleDashHorizontal => '╍',
            BoxDrawing::LightDoubleDashVertical => '╎',
            BoxDrawing::HeavyDoubleDashVertical => '╏',
            BoxDrawing::DoubleHorizontal => '═',
            BoxDrawing::DoubleVertical => '║',
            BoxDrawing::DownSingleAndRightDouble => '╒',
            BoxDrawing::DownDoubleAndRightSingle => '╓',
            BoxDrawing::DoubleDownAndRight => '╔',
            BoxDrawing::DownSingleAndLeftDouble => '╕',
            BoxDrawing::DownDoubleAndLeftSingle => '╖',
            BoxDrawing::DoubleDownAndLeft => '╗',
            BoxDrawing::UpSingleAndRightDouble => '╘',
            BoxDrawing::UpDoubleAndRightSingle => '╙',
            BoxDrawing::DoubleUpAndRight => '╚',
            BoxDrawing::UpSingleAndLeftDouble => '╛',
            BoxDrawing::UpDoubleAndLeftSingle => '╜',
            BoxDrawing::DoubleUpAndLeft => '╝',
            BoxDrawing::VerticalSingleAndRightDouble => '╞',
            BoxDrawing::VerticalDoubleAndRightSingle => '╟',
            BoxDrawing::DoubleVerticalAndRight => '╠',
            BoxDrawing::VerticalSingleAndLeftDouble => '╡',
            BoxDrawing::VerticalDoubleAndLeftSingle => '╢',
            BoxDrawing::DoubleVerticalAndLeft => '╣',
            BoxDrawing::DownSingleAndHorizontalDouble => '╤',
            BoxDrawing::DownDoubleAndHorizontalSingle => '╥',
            BoxDrawing::DoubleDownAndHorizontal => '╦',
            BoxDrawing::UpSingleAndHorizontalDouble => '╧',
            BoxDrawing::UpDoubleAndHorizontalSingle => '╨',
            BoxDrawing::DoubleUpAndHorizontal => '╩',
            BoxDrawing::VerticalSingleAndHorizontalDouble => '╪',
            BoxDrawing::VerticalDoubleAndHorizontalSingle => '╫',
            BoxDrawing::DoubleVerticalAndHorizontal => '╬',
            BoxDrawing::LightArcDownAndRight => '╭',
            BoxDrawing::LightArcDownAndLeft => '╮',
            BoxDrawing::LightArcUpAndLeft => '╯',
            BoxDrawing::LightArcUpAndRight => '╰',
            BoxDrawing::LightDiagonalUpperRightToLowerLeft => '╱',
            BoxDrawing::LightDiagonalUpperLeftToLowerRight => '╲',
            BoxDrawing::LightDiagonalCross => '╳',
            BoxDrawing::LightLeft => '╴',
            BoxDrawing::LightUp => '╵',
            BoxDrawing::LightRight => '╶',
            BoxDrawing::LightDown => '╷',
            BoxDrawing::HeavyLeft => '╸',
            BoxDrawing::HeavyUp => '╹',
            BoxDrawing::HeavyRight => '╺',
            BoxDrawing::HeavyDown => '╻',
            BoxDrawing::LightLeftAndHeavyRight => '╼',
            BoxDrawing::LightUpAndHeavyDown => '╽',
            BoxDrawing::HeavyLeftAndLightRight => '╾',
        }
    }
}

impl std::convert::TryFrom<char> for BoxDrawing {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        match c {
            '─' => Ok(BoxDrawing::LightHorizontal),
            '━' => Ok(BoxDrawing::HeavyHorizontal),
            '│' => Ok(BoxDrawing::LightVertical),
            '┃' => Ok(BoxDrawing::HeavyVertical),
            '┄' => Ok(BoxDrawing::LightTripleDashHorizontal),
            '┅' => Ok(BoxDrawing::HeavyTripleDashHorizontal),
            '┆' => Ok(BoxDrawing::LightTripleDashVertical),
            '┇' => Ok(BoxDrawing::HeavyTripleDashVertical),
            '┈' => Ok(BoxDrawing::LightQuadrupleDashHorizontal),
            '┉' => Ok(BoxDrawing::HeavyQuadrupleDashHorizontal),
            '┊' => Ok(BoxDrawing::LightQuadrupleDashVertical),
            '┋' => Ok(BoxDrawing::HeavyQuadrupleDashVertical),
            '┌' => Ok(BoxDrawing::LightDownAndRight),
            '┍' => Ok(BoxDrawing::DownLightAndRightHeavy),
            '┎' => Ok(BoxDrawing::DownHeavyAndRightLight),
            '┏' => Ok(BoxDrawing::HeavyDownAndRight),
            '┐' => Ok(BoxDrawing::LightDownAndLeft),
            '┑' => Ok(BoxDrawing::DownLightAndLeftHeavy),
            '┒' => Ok(BoxDrawing::DownHeavyAndLeftLight),
            '┓' => Ok(BoxDrawing::HeavyDownAndLeft),
            '└' => Ok(BoxDrawing::LightUpAndRight),
            '┕' => Ok(BoxDrawing::UpLightAndRightHeavy),
            '┖' => Ok(BoxDrawing::UpHeavyAndRightLight),
            '┗' => Ok(BoxDrawing::HeavyUpAndRight),
            '┘' => Ok(BoxDrawing::LightUpAndLeft),
            '┙' => Ok(BoxDrawing::UpLightAndLeftHeavy),
            '┚' => Ok(BoxDrawing::UpHeavyAndLeftLight),
            '┛' => Ok(BoxDrawing::HeavyUpAndLeft),
            '├' => Ok(BoxDrawing::LightVerticalAndRight),
            '┝' => Ok(BoxDrawing::VerticalLightAndRightHeavy),
            '┞' => Ok(BoxDrawing::UpHeavyAndRightDownLight),
            '┟' => Ok(BoxDrawing::DownHeavyAndRightUpLight),
            '┠' => Ok(BoxDrawing::VerticalHeavyAndRightLight),
            '┡' => Ok(BoxDrawing::DownLightAndRightUpHeavy),
            '┢' => Ok(BoxDrawing::UpLightAndRightDownHeavy),
            '┣' => Ok(BoxDrawing::HeavyVerticalAndRight),
            '┤' => Ok(BoxDrawing::LightVerticalAndLeft),
            '┥' => Ok(BoxDrawing::VerticalLightAndLeftHeavy),
            '┦' => Ok(BoxDrawing::UpHeavyAndLeftDownLight),
            '┧' => Ok(BoxDrawing::DownHeavyAndLeftUpLight),
            '┨' => Ok(BoxDrawing::VerticalHeavyAndLeftLight),
            '┩' => Ok(BoxDrawing::DownLightAndLeftUpHeavy),
            '┪' => Ok(BoxDrawing::UpLightAndLeftDownHeavy),
            '┫' => Ok(BoxDrawing::HeavyVerticalAndLeft),
            '┬' => Ok(BoxDrawing::LightDownAndHorizontal),
            '┭' => Ok(BoxDrawing::LeftHeavyAndRightDownLight),
            '┮' => Ok(BoxDrawing::RightHeavyAndLeftDownLight),
            '┯' => Ok(BoxDrawing::DownLightAndHorizontalHeavy),
            '┰' => Ok(BoxDrawing::DownHeavyAndHorizontalLight),
            '┱' => Ok(BoxDrawing::RightLightAndLeftDownHeavy),
            '┲' => Ok(BoxDrawing::LeftLightAndRightDownHeavy),
            '┳' => Ok(BoxDrawing::HeavyDownAndHorizontal),
            '┴' => Ok(BoxDrawing::LightUpAndHorizontal),
            '┵' => Ok(BoxDrawing::LeftHeavyAndRightUpLight),
            '┶' => Ok(BoxDrawing::RightHeavyAndLeftUpLight),
            '┷' => Ok(BoxDrawing::UpLightAndHorizontalHeavy),
            '┸' => Ok(BoxDrawing::UpHeavyAndHorizontalLight),
            '┹' => Ok(BoxDrawing::RightLightAndLeftUpHeavy),
            '┺' => Ok(BoxDrawing::LeftLightAndRightUpHeavy),
            '┻' => Ok(BoxDrawing::HeavyUpAndHorizontal),
            '┼' => Ok(BoxDrawing::LightVerticalAndHorizontal),
            '┽' => Ok(BoxDrawing::LeftHeavyAndRightVerticalLight),
            '┾' => Ok(BoxDrawing::RightHeavyAndLeftVerticalLight),
            '┿' => Ok(BoxDrawing::VerticalLightAndHorizontalHeavy),
            '╀' => Ok(BoxDrawing::UpHeavyAndDownHorizontalLight),
            '╁' => Ok(BoxDrawing::DownHeavyAndUpHorizontalLight),
            '╂' => Ok(BoxDrawing::VerticalHeavyAndHorizontalLight),
            '╃' => Ok(BoxDrawing::LeftUpHeavyAndRightDownLight),
            '╄' => Ok(BoxDrawing::RightUpHeavyAndLeftDownLight),
            '╅' => Ok(BoxDrawing::LeftDownHeavyAndRightUpLight),
            '╆' => Ok(BoxDrawing::RightDownHeavyAndLeftUpLight),
            '╇' => Ok(BoxDrawing::DownLightAndUpHorizontalHeavy),
            '╈' => Ok(BoxDrawing::UpLightAndDownHorizontalHeavy),
            '╉' => Ok(BoxDrawing::RightLightAndLeftVerticalHeavy),
            '╊' => Ok(BoxDrawing::LeftLightAndRightVerticalHeavy),
            '╋' => Ok(BoxDrawing::HeavyVerticalAndHorizontal),
            '╌' => Ok(BoxDrawing::LightDoubleDashHorizontal),
            '╍' => Ok(BoxDrawing::HeavyDoubleDashHorizontal),
            '╎' => Ok(BoxDrawing::LightDoubleDashVertical),
            '╏' => Ok(BoxDrawing::HeavyDoubleDashVertical),
            '═' => Ok(BoxDrawing::DoubleHorizontal),
            '║' => Ok(BoxDrawing::DoubleVertical),
            '╒' => Ok(BoxDrawing::DownSingleAndRightDouble),
            '╓' => Ok(BoxDrawing::DownDoubleAndRightSingle),
            '╔' => Ok(BoxDrawing::DoubleDownAndRight),
            '╕' => Ok(BoxDrawing::DownSingleAndLeftDouble),
            '╖' => Ok(BoxDrawing::DownDoubleAndLeftSingle),
            '╗' => Ok(BoxDrawing::DoubleDownAndLeft),
            '╘' => Ok(BoxDrawing::UpSingleAndRightDouble),
            '╙' => Ok(BoxDrawing::UpDoubleAndRightSingle),
            '╚' => Ok(BoxDrawing::DoubleUpAndRight),
            '╛' => Ok(BoxDrawing::UpSingleAndLeftDouble),
            '╜' => Ok(BoxDrawing::UpDoubleAndLeftSingle),
            '╝' => Ok(BoxDrawing::DoubleUpAndLeft),
            '╞' => Ok(BoxDrawing::VerticalSingleAndRightDouble),
            '╟' => Ok(BoxDrawing::VerticalDoubleAndRightSingle),
            '╠' => Ok(BoxDrawing::DoubleVerticalAndRight),
            '╡' => Ok(BoxDrawing::VerticalSingleAndLeftDouble),
            '╢' => Ok(BoxDrawing::VerticalDoubleAndLeftSingle),
            '╣' => Ok(BoxDrawing::DoubleVerticalAndLeft),
            '╤' => Ok(BoxDrawing::DownSingleAndHorizontalDouble),
            '╥' => Ok(BoxDrawing::DownDoubleAndHorizontalSingle),
            '╦' => Ok(BoxDrawing::DoubleDownAndHorizontal),
            '╧' => Ok(BoxDrawing::UpSingleAndHorizontalDouble),
            '╨' => Ok(BoxDrawing::UpDoubleAndHorizontalSingle),
            '╩' => Ok(BoxDrawing::DoubleUpAndHorizontal),
            '╪' => Ok(BoxDrawing::VerticalSingleAndHorizontalDouble),
            '╫' => Ok(BoxDrawing::VerticalDoubleAndHorizontalSingle),
            '╬' => Ok(BoxDrawing::DoubleVerticalAndHorizontal),
            '╭' => Ok(BoxDrawing::LightArcDownAndRight),
            '╮' => Ok(BoxDrawing::LightArcDownAndLeft),
            '╯' => Ok(BoxDrawing::LightArcUpAndLeft),
            '╰' => Ok(BoxDrawing::LightArcUpAndRight),
            '╱' => Ok(BoxDrawing::LightDiagonalUpperRightToLowerLeft),
            '╲' => Ok(BoxDrawing::LightDiagonalUpperLeftToLowerRight),
            '╳' => Ok(BoxDrawing::LightDiagonalCross),
            '╴' => Ok(BoxDrawing::LightLeft),
            '╵' => Ok(BoxDrawing::LightUp),
            '╶' => Ok(BoxDrawing::LightRight),
            '╷' => Ok(BoxDrawing::LightDown),
            '╸' => Ok(BoxDrawing::HeavyLeft),
            '╹' => Ok(BoxDrawing::HeavyUp),
            '╺' => Ok(BoxDrawing::HeavyRight),
            '╻' => Ok(BoxDrawing::HeavyDown),
            '╼' => Ok(BoxDrawing::LightLeftAndHeavyRight),
            '╽' => Ok(BoxDrawing::LightUpAndHeavyDown),
            '╾' => Ok(BoxDrawing::HeavyLeftAndLightRight),
            _ => Err(()),
        }
    }
}

impl Into<u32> for BoxDrawing {
    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 BoxDrawing {
    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 BoxDrawing {
    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 BoxDrawing {
    /// The character with the lowest index in this unicode block
    pub fn new() -> Self {
        BoxDrawing::LightHorizontal
    }

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