Skip to main content

actix_http/header/shared/
charset.rs

1use std::{fmt, str};
2
3/// A MIME character set.
4///
5/// The string representation is normalized to upper case.
6///
7/// See <http://www.iana.org/assignments/character-sets/character-sets.xhtml>.
8#[derive(Debug, Clone, PartialEq, Eq)]
9#[allow(non_camel_case_types)]
10pub enum Charset {
11    /// US ASCII
12    Us_Ascii,
13
14    /// ISO-8859-1
15    Iso_8859_1,
16
17    /// ISO-8859-2
18    Iso_8859_2,
19
20    /// ISO-8859-3
21    Iso_8859_3,
22
23    /// ISO-8859-4
24    Iso_8859_4,
25
26    /// ISO-8859-5
27    Iso_8859_5,
28
29    /// ISO-8859-6
30    Iso_8859_6,
31
32    /// ISO-8859-7
33    Iso_8859_7,
34
35    /// ISO-8859-8
36    Iso_8859_8,
37
38    /// ISO-8859-9
39    Iso_8859_9,
40
41    /// ISO-8859-10
42    Iso_8859_10,
43
44    /// Shift_JIS
45    Shift_Jis,
46
47    /// EUC-JP
48    Euc_Jp,
49
50    /// ISO-2022-KR
51    Iso_2022_Kr,
52
53    /// EUC-KR
54    Euc_Kr,
55
56    /// ISO-2022-JP
57    Iso_2022_Jp,
58
59    /// ISO-2022-JP-2
60    Iso_2022_Jp_2,
61
62    /// ISO-8859-6-E
63    Iso_8859_6_E,
64
65    /// ISO-8859-6-I
66    Iso_8859_6_I,
67
68    /// ISO-8859-8-E
69    Iso_8859_8_E,
70
71    /// ISO-8859-8-I
72    Iso_8859_8_I,
73
74    /// GB2312
75    Gb2312,
76
77    /// Big5
78    Big5,
79
80    /// KOI8-R
81    Koi8_R,
82
83    /// An arbitrary charset specified as a string.
84    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}