wthrr 0.8.2

Weather companion for the terminal
use serde::{Deserialize, Serialize};
use strum_macros::{AsRefStr, Display};

#[derive(Display, AsRefStr)]
pub enum Border {
	TL,
	T,
	TR,
	R,
	BR,
	B,
	BL,
	L,
}

impl Border {
	pub fn fmt<'a>(&self, variant: &BorderStyle) -> &'a str {
		match self {
			Border::TL => match variant {
				BorderStyle::single => "┌",
				BorderStyle::solid => "┏",
				BorderStyle::double => "╔",
				_ => "╭",
			},
			Border::T | Border::B => match variant {
				BorderStyle::double => "═",
				BorderStyle::solid => "━",
				_ => "─",
			},
			Border::TR => match variant {
				BorderStyle::single => "┐",
				BorderStyle::solid => "┓",
				BorderStyle::double => "╗",
				_ => "╮",
			},
			Border::R | Border::L => match variant {
				BorderStyle::double => "║",
				BorderStyle::solid => "┃",
				_ => "│",
			},
			Border::BR => match variant {
				BorderStyle::single => "┘",
				BorderStyle::solid => "┛",
				BorderStyle::double => "╝",
				_ => "╯",
			},
			Border::BL => match variant {
				BorderStyle::single => "└",
				BorderStyle::solid => "┗",
				BorderStyle::double => "╚",
				_ => "╰",
			},
		}
	}
}

#[derive(Default, Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Copy)]
#[allow(non_camel_case_types)]
pub enum BorderStyle {
	#[default]
	rounded,
	single,
	solid,
	double,
}

pub enum Edge {
	Top,
	Bottom,
}

impl Edge {
	pub fn fmt(self, width: usize, variant: &BorderStyle) -> String {
		match self {
			Self::Top => format!(
				"{}{: >width$}{}",
				Border::TL.fmt(variant),
				Border::T.fmt(variant).repeat(width),
				Border::TR.fmt(variant),
			),
			Self::Bottom => format!(
				"{}{: >width$}{}",
				Border::BL.fmt(variant),
				Border::B.fmt(variant).repeat(width),
				Border::BR.fmt(variant),
			),
		}
	}
}

pub enum Separator {
	Blank,
	Single,
	Solid,
	Double,
	Dashed,
}

impl Separator {
	pub fn fmt(self, width: usize, border_variant: &BorderStyle) -> String {
		match self {
			Self::Blank => format!(
				"{}{: >width$}{}",
				Border::L.fmt(border_variant),
				"",
				Border::R.fmt(border_variant)
			),
			Self::Dashed => format!("├{:┈>width$}┤", ""),
			Self::Single => format!("├{:─>width$}┤", ""),
			Self::Solid => format!("┠{:─>width$}┨", ""),
			Self::Double => format!("╟{:─>width$}╢", ""),
		}
	}
}