actix_http/header/shared/
charset.rs1use std::{fmt, str};
2
3#[derive(Debug, Clone, PartialEq, Eq)]
9#[allow(non_camel_case_types)]
10pub enum Charset {
11 Us_Ascii,
13
14 Iso_8859_1,
16
17 Iso_8859_2,
19
20 Iso_8859_3,
22
23 Iso_8859_4,
25
26 Iso_8859_5,
28
29 Iso_8859_6,
31
32 Iso_8859_7,
34
35 Iso_8859_8,
37
38 Iso_8859_9,
40
41 Iso_8859_10,
43
44 Shift_Jis,
46
47 Euc_Jp,
49
50 Iso_2022_Kr,
52
53 Euc_Kr,
55
56 Iso_2022_Jp,
58
59 Iso_2022_Jp_2,
61
62 Iso_8859_6_E,
64
65 Iso_8859_6_I,
67
68 Iso_8859_8_E,
70
71 Iso_8859_8_I,
73
74 Gb2312,
76
77 Big5,
79
80 Koi8_R,
82
83 Ext(String),
85}
86
87impl Charset {
88 fn label(&self) -> &str {
89 use Charset::*;
90
91 match *self {
92 Us_Ascii => "US-ASCII",
93 Iso_8859_1 => "ISO-8859-1",
94 Iso_8859_2 => "ISO-8859-2",
95 Iso_8859_3 => "ISO-8859-3",
96 Iso_8859_4 => "ISO-8859-4",
97 Iso_8859_5 => "ISO-8859-5",
98 Iso_8859_6 => "ISO-8859-6",
99 Iso_8859_7 => "ISO-8859-7",
100 Iso_8859_8 => "ISO-8859-8",
101 Iso_8859_9 => "ISO-8859-9",
102 Iso_8859_10 => "ISO-8859-10",
103 Shift_Jis => "Shift-JIS",
104 Euc_Jp => "EUC-JP",
105 Iso_2022_Kr => "ISO-2022-KR",
106 Euc_Kr => "EUC-KR",
107 Iso_2022_Jp => "ISO-2022-JP",
108 Iso_2022_Jp_2 => "ISO-2022-JP-2",
109 Iso_8859_6_E => "ISO-8859-6-E",
110 Iso_8859_6_I => "ISO-8859-6-I",
111 Iso_8859_8_E => "ISO-8859-8-E",
112 Iso_8859_8_I => "ISO-8859-8-I",
113 Gb2312 => "GB2312",
114 Big5 => "Big5",
115 Koi8_R => "KOI8-R",
116 Ext(ref cs) => cs,
117 }
118 }
119}
120
121impl fmt::Display for Charset {
122 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
123 f.write_str(self.label())
124 }
125}
126
127impl str::FromStr for Charset {
128 type Err = crate::Error;
129
130 #[inline]
131 fn from_str(cs: &str) -> Result<Charset, crate::Error> {
132 use Charset::*;
133
134 Ok(match () {
135 _ if cs.eq_ignore_ascii_case("US-ASCII") => Us_Ascii,
136 _ if cs.eq_ignore_ascii_case("ISO-8859-1") => Iso_8859_1,
137 _ if cs.eq_ignore_ascii_case("ISO-8859-2") => Iso_8859_2,
138 _ if cs.eq_ignore_ascii_case("ISO-8859-3") => Iso_8859_3,
139 _ if cs.eq_ignore_ascii_case("ISO-8859-4") => Iso_8859_4,
140 _ if cs.eq_ignore_ascii_case("ISO-8859-5") => Iso_8859_5,
141 _ if cs.eq_ignore_ascii_case("ISO-8859-6") => Iso_8859_6,
142 _ if cs.eq_ignore_ascii_case("ISO-8859-7") => Iso_8859_7,
143 _ if cs.eq_ignore_ascii_case("ISO-8859-8") => Iso_8859_8,
144 _ if cs.eq_ignore_ascii_case("ISO-8859-9") => Iso_8859_9,
145 _ if cs.eq_ignore_ascii_case("ISO-8859-10") => Iso_8859_10,
146 _ if cs.eq_ignore_ascii_case("SHIFT-JIS") => Shift_Jis,
147 _ if cs.eq_ignore_ascii_case("EUC-JP") => Euc_Jp,
148 _ if cs.eq_ignore_ascii_case("ISO-2022-KR") => Iso_2022_Kr,
149 _ if cs.eq_ignore_ascii_case("EUC-KR") => Euc_Kr,
150 _ if cs.eq_ignore_ascii_case("ISO-2022-JP") => Iso_2022_Jp,
151 _ if cs.eq_ignore_ascii_case("ISO-2022-JP-2") => Iso_2022_Jp_2,
152 _ if cs.eq_ignore_ascii_case("ISO-8859-6-E") => Iso_8859_6_E,
153 _ if cs.eq_ignore_ascii_case("ISO-8859-6-I") => Iso_8859_6_I,
154 _ if cs.eq_ignore_ascii_case("ISO-8859-8-E") => Iso_8859_8_E,
155 _ if cs.eq_ignore_ascii_case("ISO-8859-8-I") => Iso_8859_8_I,
156 _ if cs.eq_ignore_ascii_case("GB2312") => Gb2312,
157 _ if cs.eq_ignore_ascii_case("BIG5") => Big5,
158 _ if cs.eq_ignore_ascii_case("KOI8-R") => Koi8_R,
159 _ => Ext(cs.to_ascii_uppercase()),
160 })
161 }
162}
163
164#[cfg(test)]
165mod tests {
166 use super::Charset::*;
167
168 #[test]
169 fn test_parse() {
170 assert_eq!(Us_Ascii, "us-ascii".parse().unwrap());
171 assert_eq!(Us_Ascii, "US-Ascii".parse().unwrap());
172 assert_eq!(Us_Ascii, "US-ASCII".parse().unwrap());
173 assert_eq!(Shift_Jis, "Shift-JIS".parse().unwrap());
174 assert_eq!(Ext("ABCD".to_owned()), "abcd".parse().unwrap());
175 assert_eq!(Ext("UTF-8".to_owned()), "utf-8".parse().unwrap());
176 assert_eq!(Ext(String::new()), "".parse().unwrap());
177 assert_eq!(Ext("éBC".to_owned()), "ébc".parse().unwrap());
178 }
179
180 #[test]
181 fn test_display() {
182 assert_eq!("US-ASCII", Us_Ascii.to_string());
183 assert_eq!("ABCD", Ext("ABCD".to_owned()).to_string());
184 }
185}