use std::fmt::{self, Display, Formatter, Result};
use crate::{yellow_bold, CStyle, RESET_COLOR};
#[derive(Debug, Clone)]
pub struct Banner {
text: String,
font: &'static BannerFont,
}
impl Display for Banner {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(f, "{}", self.render(yellow_bold))
}
}
impl Banner {
pub fn new(text: impl Into<String>) -> Self {
Self {
text: text.into().to_uppercase(),
font: &BANNER_FONTS[0],
}
}
pub fn render(&self,style: &'static CStyle) -> String {
let rendered = self.font.render(&self.text, style);
rendered
.into_iter()
.map(|line| format!("{}{}", style, line))
.collect::<Vec<_>>()
.join("\n")
}
pub fn show(&self,style: &'static CStyle) {
println!("{}",self.render(style));
}
}
#[derive(Debug, Clone, Copy)]
pub struct BannerFont {
pub letter_builder: fn(char) -> Vec<&'static str>,
pub space: &'static str,
pub max_height: usize,
}
impl BannerFont {
pub fn render(&self, text: &str, char_style: &CStyle) -> Vec<String> {
let mut result = vec![String::new(); self.max_height];
for (i, c) in text.chars().enumerate() {
let letter = (self.letter_builder)(c);
for (j, line) in result.iter_mut().enumerate() {
line.push_str(self.space);
let styled_line = letter
.get(j)
.unwrap_or(&self.space)
.chars()
.map(|ch| format!("{}{}", char_style, ch))
.collect::<String>();
line.push_str(&styled_line);
}
}
result
}
}
const CUBIC_FONT: BannerFont = BannerFont {
letter_builder: cubic_font,
space: " ",
max_height: 4,
};
const BRICK_FONT: BannerFont = BannerFont {
letter_builder: brick_font,
space: " ",
max_height: 5,
};
const TALL_FONT: BannerFont = BannerFont {
letter_builder: tall_font,
space: " ",
max_height: 7,
};
pub const BANNER_FONTS: [BannerFont; 3] = [
CUBIC_FONT,
BRICK_FONT,
TALL_FONT,
];
pub fn cubic_font(c: char) -> Vec<&'static str> {
match c {
'A' => vec![
"██████ ",
"██ ██",
"████████",
"██ ██",
],
'B' | 'b' => vec![
"██████ ",
"██ ██",
"██████ ",
"███████ ",
],
'C' | 'c' => vec![
" ████ ",
"██ ",
"██ ",
"██████ ",
],
'D' | 'd' => vec![
"██████ ",
"██ ██",
"██ ██",
"██████ ",
],
'E' | 'e' => vec![
"███████",
"██ ",
"█████ ",
"███████",
],
'F' => vec![
"███████ ",
"██ ",
"█████ ",
"██ ",
],
'G' => vec![
" █████ ",
"██ ",
"██ ██",
"███████ ",
],
'H' => vec![
"██ ",
"██████",
"██ ██",
"██ ██",
],
'I' => vec![
"███",
"███",
"███",
"███",
],
'J' => vec![
" ██",
" ██",
"██ ██",
" ███ ",
],
'K' => vec![
"██ ██",
"██ ██ ",
"█████ ",
"██ ██",
],
'L' => vec![
"██ ",
"██ ",
"██ ",
"███████ ",
],
'M' | 'm' => vec![
"████████ ",
"██ ██ ██",
"██ ██ ██",
"██ ██ ██",
],
'N' | 'n' => vec![
"██████ ",
"██ ██",
"██ ██",
"██ ██",
],
'O' | 'o' => vec![
"██████ ",
"██ ██",
"██ ██",
" ██████",
],
'P' | 'p' => vec![
"██████ ",
"██ ██",
"████████ ",
"██ ",
],
'Q' | 'q' => vec![
" ██████ ",
"██ ██",
"██ ██ █",
" ████ ██",
],
'R' | 'r' => vec![
"██████ ",
"██ ██",
"██████ ",
"██ ██ ",
],
'S' | 's' => vec![
"███████",
"██ ",
" ██",
"███████",
],
'T' | 't' => vec![
"██████",
"██",
"██",
"██",
],
'U' | 'u' => vec![
"██ ██",
"██ ██",
"██ ██",
"██████",
],
'V' | 'v' => vec![
"██ ██",
"██ ██",
"██ ██",
"████",
],
'W' => vec![
"██ ██",
"██ ██ ██",
"███ ███",
"██ ██",
],
'X' => vec![
"██ ██",
"██ ██ ",
" ████ ",
"██ ██ ",
],
'Y' | 'y' => vec![
"██ ██",
"██ ██",
"████",
"██",
],
'Z' => vec![
"██████ ",
" ██ ",
"██ ",
"██████ ",
],
' ' => vec![
" ",
" ",
" ",
" ",
],
_ => vec![
"?????",
"?????",
"?????",
"?????",
],
}
}
pub fn print_cubic_text(text: &str) {
let chars: Vec<char> = text.to_uppercase().chars().collect();
let letters: Vec<Vec<&str>> = chars.iter().map(|&c| cubic_font(c)).collect();
for row in 0..4 {
for letter in &letters {
print!("{} ", letter[row]);
}
println!();
}
}
pub fn brick_font(c: char) -> Vec<&'static str> {
match c {
'A' => vec![
" ██████╗ ",
"██╔═══██╗",
"██║ ██║",
"██║ ██║",
"╚██████╔╝",
],
'B' => vec![
"██████╗ ",
"██╔══██╗",
"██████╔╝",
"██╔══██╗",
"██████╔╝",
],
'C' => vec![
" ██████╗",
"██╔════╝",
"██║ ",
"██║ ",
"╚██████╗",
],
'D' => vec![
"██████╗ ",
"██╔══██╗",
"██║ ██║",
"██║ ██║",
"██████╔╝",
],
'E' => vec![
"███████╗",
"██╔════╝",
"█████╗ ",
"██╔══╝ ",
"███████╗",
],
'F' => vec![
"███████╗",
"██╔════╝",
"█████╗ ",
"██╔══╝ ",
"██║ ",
],
'G' => vec![
" ██████╗ ",
"██╔════╝ ",
"██║ ███╗",
"██║ ██║",
"╚██████╔╝",
],
'H' => vec![
"██╗ ██╗",
"██║ ██║",
"███████║",
"██╔══██║",
"██║ ██║",
],
'I' => vec![
"██╗",
"██║",
"██║",
"██║",
"██║",
],
'J' => vec![
" ██╗",
" ██║",
" ██║",
"██ ██║",
"╚█████╔╝",
],
'K' => vec![
"██╗ ██╗",
"██║ ██╔╝",
"█████╔╝ ",
"██╔═██╗ ",
"██║ ██╗",
],
'L' => vec![
"██╗ ",
"██║ ",
"██║ ",
"██║ ",
"███████╗",
],
'M' => vec![
"███╗ ███╗",
"████╗ ████║",
"██╔████╔██║",
"██║╚██╔╝██║",
"██║ ╚═╝ ██║",
],
'N' => vec![
"███╗ ██╗",
"████╗ ██║",
"██╔██╗ ██║",
"██║╚██╗██║",
"██║ ╚████║",
],
'O' => vec![
" ██████╗ ",
"██╔═══██╗",
"██║ ██║",
"██║ ██║",
"╚██████╔╝",
],
'P' => vec![
"██████╗ ",
"██╔══██╗",
"██████╔╝",
"██╔═══╝ ",
"██║ ",
],
'Q' => vec![
" ██████╗ ",
"██╔═══██╗",
"██║ ██║",
"██║▄▄ ██║",
"╚██████╔╝",
],
'R' => vec![
"██████╗ ",
"██╔══██╗",
"██████╔╝",
"██╔══██╗",
"██║ ██║",
],
'S' => vec![
"███████╗",
"██╔════╝",
"███████╗",
"╚════██║",
"███████║",
],
'T' => vec![
"████████╗",
"╚══██╔══╝",
" ██║ ",
" ██║ ",
" ██║ ",
],
'U' => vec![
"██╗ ██╗",
"██║ ██║",
"██║ ██║",
"██║ ██║",
"╚██████╔╝",
],
'V' => vec![
"██╗ ██╗",
"██║ ██║",
"██║ ██║",
"╚██╗ ██╔╝",
" ╚████╔╝ ",
],
'W' => vec![
"██╗ ██╗",
"██║ ██║",
"██║ █╗ ██║",
"██║███╗██║",
"╚███╔███╔╝",
],
'X' => vec![
"██╗ ██╗",
"╚██╗██╔╝",
" ╚███╔╝ ",
" ██╔██╗ ",
"██╔╝ ██╗",
],
'Y' => vec![
"██╗ ██╗",
"╚██╗ ██╔╝",
" ╚████╔╝ ",
" ╚██╔╝ ",
" ██║ ",
],
'Z' => vec![
"███████╗",
"╚══███╔╝",
" ███╔╝ ",
" ███╔╝ ",
"███████╗",
],
_ => vec![" ", " ", " ", " ", " "],
}
}
pub fn tall_font(c: char) -> Vec<&'static str> {
match c {
'A' => vec![
"██████",
"██ ██",
"██████",
"██ ██",
"██ ██",
],
'B' => vec![
"█████ ",
"██ ██",
"█████ ",
"██ ██",
"█████ ",
],
'C' => vec![
" █████",
"██ ",
"██ ",
"██ ",
" █████",
],
'D' => vec![
"█████ ",
"██ ██",
"██ ██",
"██ ██",
"█████ ",
],
'E' => vec![
"██████",
"██ ",
"█████ ",
"██ ",
"██████",
],
'F' => vec![
"██████",
"██ ",
"█████ ",
"██ ",
"██ ",
],
'G' => vec![
" █████",
"██ ",
"██ ██",
"██ ██",
" █████",
],
'H' => vec![
"██ ██",
"██ ██",
"██████",
"██ ██",
"██ ██",
],
'I' => vec![
"█████",
" ██ ",
" ██ ",
" ██ ",
"█████",
],
'J' => vec![
"██████",
" ██ ",
" ██ ",
"██ ██ ",
"████ ",
],
'K' => vec![
"██ ██",
"██ ██ ",
"████ ",
"██ ██ ",
"██ ██",
],
'L' => vec![
"██ ",
"██ ",
"██ ",
"██ ",
"██████",
],
'M' => vec![
"██ ██",
"███ ███",
"██ █ ██",
"██ ██",
"██ ██",
],
'N' => vec![
"██ ██",
"███ ██",
"██ █ ██",
"██ ███",
"██ ██",
],
'O' => vec![
" █████ ",
"██ ██",
"██ ██",
"██ ██",
" █████ ",
],
'P' => vec![
"█████ ",
"██ ██",
"█████ ",
"██ ",
"██ ",
],
'Q' => vec![
" █████ ",
"██ ██",
"██ █ ██",
"██ ██ ",
" ██████",
],
'R' => vec![
"█████ ",
"██ ██",
"█████ ",
"██ ██ ",
"██ ██",
],
'S' => vec![
" █████",
"██ ",
" █████",
" ██",
"█████ ",
],
'T' => vec![
"██████",
" ██ ",
" ██ ",
" ██ ",
" ██ ",
],
'U' => vec![
"██ ██",
"██ ██",
"██ ██",
"██ ██",
" █████ ",
],
'V' => vec![
"██ ██",
"██ ██",
"██ ██",
" ██ ██ ",
" ███ ",
],
'W' => vec![
"██ ██",
"██ ██",
"██ █ ██",
"███ ███",
"██ ██",
],
'X' => vec![
"██ ██",
" ██ ██ ",
" ███ ",
" ██ ██ ",
"██ ██",
],
'Y' => vec![
"██ ██",
" ██ ██ ",
" ███ ",
" ██ ",
" ██ ",
],
'Z' => vec![
"██████",
" ██ ",
" ██ ",
" ██ ",
"██████",
],
_ => vec![" ", " ", " ", " ", " "],
}
}