#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum BoxDrawing {
LightHorizontal,
HeavyHorizontal,
LightVertical,
HeavyVertical,
LightTripleDashHorizontal,
HeavyTripleDashHorizontal,
LightTripleDashVertical,
HeavyTripleDashVertical,
LightQuadrupleDashHorizontal,
HeavyQuadrupleDashHorizontal,
LightQuadrupleDashVertical,
HeavyQuadrupleDashVertical,
LightDownAndRight,
DownLightAndRightHeavy,
DownHeavyAndRightLight,
HeavyDownAndRight,
LightDownAndLeft,
DownLightAndLeftHeavy,
DownHeavyAndLeftLight,
HeavyDownAndLeft,
LightUpAndRight,
UpLightAndRightHeavy,
UpHeavyAndRightLight,
HeavyUpAndRight,
LightUpAndLeft,
UpLightAndLeftHeavy,
UpHeavyAndLeftLight,
HeavyUpAndLeft,
LightVerticalAndRight,
VerticalLightAndRightHeavy,
UpHeavyAndRightDownLight,
DownHeavyAndRightUpLight,
VerticalHeavyAndRightLight,
DownLightAndRightUpHeavy,
UpLightAndRightDownHeavy,
HeavyVerticalAndRight,
LightVerticalAndLeft,
VerticalLightAndLeftHeavy,
UpHeavyAndLeftDownLight,
DownHeavyAndLeftUpLight,
VerticalHeavyAndLeftLight,
DownLightAndLeftUpHeavy,
UpLightAndLeftDownHeavy,
HeavyVerticalAndLeft,
LightDownAndHorizontal,
LeftHeavyAndRightDownLight,
RightHeavyAndLeftDownLight,
DownLightAndHorizontalHeavy,
DownHeavyAndHorizontalLight,
RightLightAndLeftDownHeavy,
LeftLightAndRightDownHeavy,
HeavyDownAndHorizontal,
LightUpAndHorizontal,
LeftHeavyAndRightUpLight,
RightHeavyAndLeftUpLight,
UpLightAndHorizontalHeavy,
UpHeavyAndHorizontalLight,
RightLightAndLeftUpHeavy,
LeftLightAndRightUpHeavy,
HeavyUpAndHorizontal,
LightVerticalAndHorizontal,
LeftHeavyAndRightVerticalLight,
RightHeavyAndLeftVerticalLight,
VerticalLightAndHorizontalHeavy,
UpHeavyAndDownHorizontalLight,
DownHeavyAndUpHorizontalLight,
VerticalHeavyAndHorizontalLight,
LeftUpHeavyAndRightDownLight,
RightUpHeavyAndLeftDownLight,
LeftDownHeavyAndRightUpLight,
RightDownHeavyAndLeftUpLight,
DownLightAndUpHorizontalHeavy,
UpLightAndDownHorizontalHeavy,
RightLightAndLeftVerticalHeavy,
LeftLightAndRightVerticalHeavy,
HeavyVerticalAndHorizontal,
LightDoubleDashHorizontal,
HeavyDoubleDashHorizontal,
LightDoubleDashVertical,
HeavyDoubleDashVertical,
DoubleHorizontal,
DoubleVertical,
DownSingleAndRightDouble,
DownDoubleAndRightSingle,
DoubleDownAndRight,
DownSingleAndLeftDouble,
DownDoubleAndLeftSingle,
DoubleDownAndLeft,
UpSingleAndRightDouble,
UpDoubleAndRightSingle,
DoubleUpAndRight,
UpSingleAndLeftDouble,
UpDoubleAndLeftSingle,
DoubleUpAndLeft,
VerticalSingleAndRightDouble,
VerticalDoubleAndRightSingle,
DoubleVerticalAndRight,
VerticalSingleAndLeftDouble,
VerticalDoubleAndLeftSingle,
DoubleVerticalAndLeft,
DownSingleAndHorizontalDouble,
DownDoubleAndHorizontalSingle,
DoubleDownAndHorizontal,
UpSingleAndHorizontalDouble,
UpDoubleAndHorizontalSingle,
DoubleUpAndHorizontal,
VerticalSingleAndHorizontalDouble,
VerticalDoubleAndHorizontalSingle,
DoubleVerticalAndHorizontal,
LightArcDownAndRight,
LightArcDownAndLeft,
LightArcUpAndLeft,
LightArcUpAndRight,
LightDiagonalUpperRightToLowerLeft,
LightDiagonalUpperLeftToLowerRight,
LightDiagonalCross,
LightLeft,
LightUp,
LightRight,
LightDown,
HeavyLeft,
HeavyUp,
HeavyRight,
HeavyDown,
LightLeftAndHeavyRight,
LightUpAndHeavyDown,
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 {
pub fn new() -> Self {
BoxDrawing::LightHorizontal
}
pub fn name(&self) -> String {
let s = std::format!("BoxDrawing{:#?}", self);
string_morph::to_sentence_case(&s)
}
}