use crate::error::Error;
use encoding_rs::Encoding;
pub fn lcid_to_encoding(lcid: u32) -> Result<&'static Encoding, Error> {
match lcid {
0x0409 | 0x0809 | 0x0C09 | 0x1009 | 0x1409 | 0x1809 | 0x1C09 | 0x2009 | 0x2409 | 0x2809 | 0x2C09 | 0x3009 | 0x3409 | 0x0407 | 0x0807 | 0x0C07 | 0x1007 | 0x1407 | 0x040C | 0x080C | 0x0C0C | 0x100C | 0x140C | 0x180C | 0x040A | 0x080A | 0x0C0A | 0x100A | 0x140A | 0x180A | 0x1C0A | 0x200A | 0x240A | 0x280A | 0x2C0A | 0x300A | 0x340A | 0x380A | 0x3C0A | 0x400A | 0x440A | 0x480A | 0x4C0A | 0x500A | 0x0410 | 0x0810 | 0x0413 | 0x0813 | 0x0416 | 0x0816 | 0x041D | 0x081D | 0x0414 | 0x0814 | 0x0406 | 0x040B | 0x040F | 0x0438 => Ok(encoding_rs::WINDOWS_1252),
0x0411 => Ok(encoding_rs::SHIFT_JIS),
0x0804 | 0x1004 => Ok(encoding_rs::GBK),
0x0404 | 0x0C04 | 0x1404 => Ok(encoding_rs::BIG5),
0x0412 => Ok(encoding_rs::EUC_KR),
0x0415 | 0x0405 | 0x040E | 0x0418 | 0x041A | 0x041B | 0x0424 | 0x041C => Ok(encoding_rs::WINDOWS_1250),
0x0419 | 0x0422 | 0x0423 | 0x0402 | 0x0C1A | 0x1C1A | 0x281A | 0x042F | 0x043F | 0x0843 | 0x0444 | 0x0440 => Ok(encoding_rs::WINDOWS_1251),
0x0408 => Ok(encoding_rs::WINDOWS_1253),
0x041F | 0x042C => Ok(encoding_rs::WINDOWS_1254),
0x040D => Ok(encoding_rs::WINDOWS_1255),
0x0401 | 0x0801 | 0x0C01 | 0x1001 | 0x1401 | 0x1801 | 0x1C01 | 0x2001 | 0x2401 | 0x2801 | 0x2C01 | 0x3001 | 0x3401 | 0x3801 | 0x3C01 | 0x4001 | 0x0420 | 0x0429 => Ok(encoding_rs::WINDOWS_1256),
0x0425..=0x0427 => Ok(encoding_rs::WINDOWS_1257),
0x042A => Ok(encoding_rs::WINDOWS_1258),
0x041E => Ok(encoding_rs::WINDOWS_874),
_ => Err(Error::UnsupportedEncoding { lcid }),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_western_european_lcids() {
assert_eq!(lcid_to_encoding(0x0409).unwrap(), encoding_rs::WINDOWS_1252);
assert_eq!(lcid_to_encoding(0x0809).unwrap(), encoding_rs::WINDOWS_1252);
assert_eq!(lcid_to_encoding(0x0407).unwrap(), encoding_rs::WINDOWS_1252);
assert_eq!(lcid_to_encoding(0x040C).unwrap(), encoding_rs::WINDOWS_1252);
}
#[test]
fn test_asian_lcids() {
assert_eq!(lcid_to_encoding(0x0411).unwrap(), encoding_rs::SHIFT_JIS);
assert_eq!(lcid_to_encoding(0x0804).unwrap(), encoding_rs::GBK);
assert_eq!(lcid_to_encoding(0x0404).unwrap(), encoding_rs::BIG5);
assert_eq!(lcid_to_encoding(0x0412).unwrap(), encoding_rs::EUC_KR);
}
#[test]
fn test_eastern_european_lcids() {
assert_eq!(lcid_to_encoding(0x0415).unwrap(), encoding_rs::WINDOWS_1250);
assert_eq!(lcid_to_encoding(0x0405).unwrap(), encoding_rs::WINDOWS_1250);
assert_eq!(lcid_to_encoding(0x040E).unwrap(), encoding_rs::WINDOWS_1250);
}
#[test]
fn test_cyrillic_lcids() {
assert_eq!(lcid_to_encoding(0x0419).unwrap(), encoding_rs::WINDOWS_1251);
assert_eq!(lcid_to_encoding(0x0422).unwrap(), encoding_rs::WINDOWS_1251);
assert_eq!(lcid_to_encoding(0x0402).unwrap(), encoding_rs::WINDOWS_1251);
}
#[test]
fn test_other_lcids() {
assert_eq!(lcid_to_encoding(0x0408).unwrap(), encoding_rs::WINDOWS_1253);
assert_eq!(lcid_to_encoding(0x041F).unwrap(), encoding_rs::WINDOWS_1254);
assert_eq!(lcid_to_encoding(0x040D).unwrap(), encoding_rs::WINDOWS_1255);
assert_eq!(lcid_to_encoding(0x0401).unwrap(), encoding_rs::WINDOWS_1256);
assert_eq!(lcid_to_encoding(0x0425).unwrap(), encoding_rs::WINDOWS_1257);
assert_eq!(lcid_to_encoding(0x042A).unwrap(), encoding_rs::WINDOWS_1258);
assert_eq!(lcid_to_encoding(0x041E).unwrap(), encoding_rs::WINDOWS_874);
}
#[test]
fn test_unsupported_lcid() {
assert!(lcid_to_encoding(0xFFFF).is_err());
assert!(lcid_to_encoding(0x0000).is_err());
}
}