shell_util/
encoding.rs

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}