use bitflags::bitflags;
use crate::borders;
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Border: u8 {
const TOP = 0b0001;
const RIGHT = 0b0010;
const BOTTOM = 0b0100;
const LEFT = 0b1000;
const NONE = 0b0000;
const ALL = 0b1111;
}
}
#[derive(Debug, Default, Hash)]
pub enum BorderType {
#[default]
Normal,
Rounded,
Thicker,
Thick,
Double,
Dash,
}
impl BorderType {
pub fn get(&self, border: Border) -> char {
match self {
BorderType::Normal => self.get_normal(border),
BorderType::Rounded => self.get_rounded(border),
BorderType::Thicker => self.get_thicker(border),
BorderType::Thick => self.get_thick(border),
BorderType::Double => self.get_double(border),
BorderType::Dash => self.get_dash(border),
}
}
fn get_normal(&self, border: Border) -> char {
match border {
Border::TOP | Border::BOTTOM => '─',
Border::LEFT | Border::RIGHT => '│',
b if b == (Border::TOP | Border::LEFT) => '┌',
b if b == (Border::TOP | Border::RIGHT) => '┐',
b if b == (Border::BOTTOM | Border::LEFT) => '└',
b if b == (Border::BOTTOM | Border::RIGHT) => '┘',
b if b == borders!(LEFT, TOP, BOTTOM) => '├',
b if b == borders!(RIGHT, TOP, BOTTOM) => '┤',
b if b == borders!(TOP, LEFT, RIGHT) => '┬',
b if b == borders!(BOTTOM, LEFT, RIGHT) => '┴',
b if b == borders!(TOP, BOTTOM, LEFT, RIGHT) => '┼',
_ => ' ',
}
}
fn get_rounded(&self, border: Border) -> char {
match border {
Border::TOP | Border::BOTTOM => '─',
Border::LEFT | Border::RIGHT => '│',
b if b == (Border::TOP | Border::LEFT) => '╭',
b if b == (Border::TOP | Border::RIGHT) => '╮',
b if b == (Border::BOTTOM | Border::LEFT) => '╰',
b if b == (Border::BOTTOM | Border::RIGHT) => '╯',
b if b == borders!(LEFT, TOP, BOTTOM) => '├',
b if b == borders!(RIGHT, TOP, BOTTOM) => '┤',
b if b == borders!(TOP, LEFT, RIGHT) => '┬',
b if b == borders!(BOTTOM, LEFT, RIGHT) => '┴',
b if b == borders!(TOP, BOTTOM, LEFT, RIGHT) => '┼',
_ => ' ',
}
}
fn get_thicker(&self, border: Border) -> char {
match border {
Border::TOP | Border::BOTTOM => '━',
Border::LEFT | Border::RIGHT => '┃',
b if b == (Border::TOP | Border::LEFT) => '┏',
b if b == (Border::TOP | Border::RIGHT) => '┓',
b if b == (Border::BOTTOM | Border::LEFT) => '┗',
b if b == (Border::BOTTOM | Border::RIGHT) => '┛',
b if b == borders!(LEFT, TOP, BOTTOM) => '┣',
b if b == borders!(RIGHT, TOP, BOTTOM) => '┫',
b if b == borders!(TOP, LEFT, RIGHT) => '┳',
b if b == borders!(BOTTOM, LEFT, RIGHT) => '┻',
b if b == borders!(TOP, BOTTOM, LEFT, RIGHT) => '╋',
_ => ' ',
}
}
fn get_thick(&self, border: Border) -> char {
match border {
Border::TOP => '▀',
Border::BOTTOM => '▄',
Border::LEFT => '▌',
Border::RIGHT => '▐',
b if b == (Border::TOP | Border::LEFT) => '▛',
b if b == (Border::TOP | Border::RIGHT) => '▜',
b if b == (Border::BOTTOM | Border::LEFT) => '▙',
b if b == (Border::BOTTOM | Border::RIGHT) => '▟',
_ => ' ',
}
}
fn get_double(&self, border: Border) -> char {
match border {
Border::TOP | Border::BOTTOM => '═',
Border::LEFT | Border::RIGHT => '║',
b if b == (Border::TOP | Border::LEFT) => '╔',
b if b == (Border::TOP | Border::RIGHT) => '╗',
b if b == (Border::BOTTOM | Border::LEFT) => '╚',
b if b == (Border::BOTTOM | Border::RIGHT) => '╝',
b if b == borders!(LEFT, TOP, BOTTOM) => '╠',
b if b == borders!(RIGHT, TOP, BOTTOM) => '╣',
b if b == borders!(TOP, LEFT, RIGHT) => '╦',
b if b == borders!(BOTTOM, LEFT, RIGHT) => '╩',
b if b == borders!(TOP, BOTTOM, LEFT, RIGHT) => '╬',
_ => ' ',
}
}
fn get_dash(&self, border: Border) -> char {
match border {
Border::TOP | Border::BOTTOM => '╌',
Border::LEFT | Border::RIGHT => '╎',
b if b == (Border::TOP | Border::LEFT) => '┌',
b if b == (Border::TOP | Border::RIGHT) => '┐',
b if b == (Border::BOTTOM | Border::LEFT) => '└',
b if b == (Border::BOTTOM | Border::RIGHT) => '┘',
b if b == borders!(LEFT, TOP, BOTTOM) => '├',
b if b == borders!(RIGHT, TOP, BOTTOM) => '┤',
b if b == borders!(TOP, LEFT, RIGHT) => '┬',
b if b == borders!(BOTTOM, LEFT, RIGHT) => '┴',
b if b == borders!(TOP, BOTTOM, LEFT, RIGHT) => '┼',
_ => ' ',
}
}
}