pub struct Font {
char_map: &'static [(char, u8)],
}
impl Font {
pub const fn new(char_map: &'static [(char, u8)]) -> Self {
Self { char_map }
}
pub fn get_char(&self, ch: char) -> u8 {
for &(font_char, segments) in self.char_map {
if font_char == ch {
return segments;
}
}
0x00 }
}
pub const STANDARD_FONT: Font = Font::new(&[
('0', 0b01111110), ('1', 0b00110000), ('2', 0b01101101), ('3', 0b01111001), ('4', 0b00110011), ('5', 0b01011011), ('6', 0b01011111), ('7', 0b01110000), ('8', 0b01111111), ('9', 0b01111011), ('A', 0b01110111), ('B', 0b00011111), ('C', 0b01001110), ('D', 0b00111101), ('E', 0b01001111), ('F', 0b01000111), ('H', 0b00110111), ('L', 0b00001110), ('P', 0b01100111), ('U', 0b00111110), ('-', 0b00000001), (' ', 0b00000000), ]);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_standard_font_known_chars() {
assert_eq!(STANDARD_FONT.get_char('0'), 0b01111110);
assert_eq!(STANDARD_FONT.get_char('1'), 0b00110000);
assert_eq!(STANDARD_FONT.get_char('2'), 0b01101101);
assert_eq!(STANDARD_FONT.get_char('A'), 0b01110111);
assert_eq!(STANDARD_FONT.get_char('F'), 0b01000111);
assert_eq!(STANDARD_FONT.get_char('-'), 0b00000001);
assert_eq!(STANDARD_FONT.get_char(' '), 0b00000000);
}
#[test]
fn test_standard_font_unknown_char() {
assert_eq!(STANDARD_FONT.get_char('z'), 0b00000000);
assert_eq!(STANDARD_FONT.get_char('€'), 0b00000000);
assert_eq!(STANDARD_FONT.get_char('@'), 0b00000000);
}
#[test]
fn test_custom_font() {
const CUSTOM_FONT_DATA: &[(char, u8)] = &[('X', 0b10101010), ('Y', 0b01010101)];
let custom_font = Font::new(CUSTOM_FONT_DATA);
assert_eq!(custom_font.get_char('X'), 0b10101010);
assert_eq!(custom_font.get_char('Y'), 0b01010101);
assert_eq!(custom_font.get_char('Z'), 0b00000000);
}
#[test]
fn test_font_new() {
const TEST_DATA: &[(char, u8)] = &[('A', 0xFF), ('B', 0x00)];
let font = Font::new(TEST_DATA);
assert_eq!(font.get_char('A'), 0xFF);
assert_eq!(font.get_char('B'), 0x00);
assert_eq!(font.get_char('C'), 0x00); }
}