use encoding::{Encoding};
use encoding::all::{WINDOWS_1251, WINDOWS_1252};
macro_attr! {
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[derive(IterVariants!(CodePageVariants))]
pub enum CodePage {
English,
Russian,
}
}
impl CodePage {
pub fn encoding(self) -> &'static dyn Encoding {
match self {
CodePage::English => WINDOWS_1252,
CodePage::Russian => WINDOWS_1251,
}
}
}
#[cfg(test)]
mod tests {
use crate::code::*;
use encoding::{DecoderTrap, EncoderTrap};
#[test]
fn all_code_pages_are_single_byte_encodings() {
for code_page in CodePage::iter_variants() {
let encoding = code_page.encoding();
for byte in 0u8 ..= 255 {
let c = encoding.decode(&[byte], DecoderTrap::Strict).unwrap();
let b = encoding.encode(&c, EncoderTrap::Strict).unwrap();
assert_eq!(b.len(), 1);
assert_eq!(b[0], byte);
}
for byte in 0u8 .. 128 {
let c = encoding.decode(&[byte], DecoderTrap::Strict).unwrap();
assert_eq!(c.len(), 1);
assert_eq!(byte as u32, c.as_bytes()[0] as u32);
}
}
}
}