1use serde::{Deserialize, Serialize};
2
3use crate::shell::Buffer;
4
5#[derive(Debug, Clone, Deserialize, Eq, PartialEq, Serialize)]
6pub enum Encoding {
7 #[serde(rename = "raw")]
8 Raw,
9 #[serde(rename = "utf-8")]
10 Utf8,
11 #[serde(rename = "utf-16")]
12 Utf16,
13 #[serde(rename = "gbk")]
14 Gbk,
15 #[serde(rename = "gb18030")]
16 Gb18030,
17 #[serde(rename = "big5")]
18 Big5,
19 #[serde(rename = "euc-jp")]
20 EucJp,
21 #[serde(rename = "euc-kr")]
22 EucKr,
23 #[serde(rename = "iso-2022-jp")]
24 Iso2022Jp,
25 #[serde(rename = "shift-jis")]
26 ShiftJis,
27}
28
29impl Encoding {
30 pub fn decode(&self, line: Vec<u8>) -> Buffer {
31 match <&Encoding as TryInto<&'static encoding_rs::Encoding>>::try_into(
32 self,
33 ) {
34 Ok(encoding) => {
35 let encoding = encoding.decode_with_bom_removal(&line).0;
36 Buffer::Text(encoding.into())
37 }
38 Err(_) => Buffer::Raw(line),
39 }
40 }
41}
42
43impl TryInto<&'static encoding_rs::Encoding> for &Encoding {
44 type Error = ();
45
46 fn try_into(
47 self,
48 ) -> Result<&'static encoding_rs::Encoding, Self::Error> {
49 match self {
50 Encoding::Raw => Err(()),
51 Encoding::Utf8 => Ok(encoding_rs::UTF_8),
52 Encoding::Gbk => Ok(encoding_rs::GBK),
53 Encoding::Gb18030 => Ok(encoding_rs::GB18030),
54 Encoding::Big5 => Ok(encoding_rs::BIG5),
55 Encoding::EucJp => Ok(encoding_rs::EUC_JP),
56 Encoding::Iso2022Jp => Ok(encoding_rs::ISO_2022_JP),
57 Encoding::ShiftJis => Ok(encoding_rs::SHIFT_JIS),
58 Encoding::EucKr => Ok(encoding_rs::EUC_KR),
59 Encoding::Utf16 => Ok(encoding_rs::UTF_16LE),
60 }
61 }
62}