hyperx/header/shared/
charset.rs

1use std::fmt::{self, Display};
2use std::str::FromStr;
3
4use self::Charset::*;
5
6/// A Mime charset.
7///
8/// The string representation is normalised to upper case.
9///
10/// See [http://www.iana.org/assignments/character-sets/character-sets.xhtml][url].
11///
12/// [url]: http://www.iana.org/assignments/character-sets/character-sets.xhtml
13#[derive(Clone,Debug,PartialEq)]
14#[allow(non_camel_case_types)]
15pub enum Charset{
16    /// US ASCII
17    Us_Ascii,
18    /// ISO-8859-1
19    Iso_8859_1,
20    /// ISO-8859-2
21    Iso_8859_2,
22    /// ISO-8859-3
23    Iso_8859_3,
24    /// ISO-8859-4
25    Iso_8859_4,
26    /// ISO-8859-5
27    Iso_8859_5,
28    /// ISO-8859-6
29    Iso_8859_6,
30    /// ISO-8859-7
31    Iso_8859_7,
32    /// ISO-8859-8
33    Iso_8859_8,
34    /// ISO-8859-9
35    Iso_8859_9,
36    /// ISO-8859-10
37    Iso_8859_10,
38    /// Shift_JIS
39    Shift_Jis,
40    /// EUC-JP
41    Euc_Jp,
42    /// ISO-2022-KR
43    Iso_2022_Kr,
44    /// EUC-KR
45    Euc_Kr,
46    /// ISO-2022-JP
47    Iso_2022_Jp,
48    /// ISO-2022-JP-2
49    Iso_2022_Jp_2,
50    /// ISO-8859-6-E
51    Iso_8859_6_E,
52    /// ISO-8859-6-I
53    Iso_8859_6_I,
54    /// ISO-8859-8-E
55    Iso_8859_8_E,
56    /// ISO-8859-8-I
57    Iso_8859_8_I,
58    /// GB2312
59    Gb2312,
60    /// Big5
61    Big5,
62    /// KOI8-R
63    Koi8_R,
64    /// An arbitrary charset specified as a string
65    Ext(String)
66}
67
68impl Charset {
69    fn name(&self) -> &str {
70        match *self {
71            Us_Ascii => "US-ASCII",
72            Iso_8859_1 => "ISO-8859-1",
73            Iso_8859_2 => "ISO-8859-2",
74            Iso_8859_3 => "ISO-8859-3",
75            Iso_8859_4 => "ISO-8859-4",
76            Iso_8859_5 => "ISO-8859-5",
77            Iso_8859_6 => "ISO-8859-6",
78            Iso_8859_7 => "ISO-8859-7",
79            Iso_8859_8 => "ISO-8859-8",
80            Iso_8859_9 => "ISO-8859-9",
81            Iso_8859_10 => "ISO-8859-10",
82            Shift_Jis => "Shift-JIS",
83            Euc_Jp => "EUC-JP",
84            Iso_2022_Kr => "ISO-2022-KR",
85            Euc_Kr => "EUC-KR",
86            Iso_2022_Jp => "ISO-2022-JP",
87            Iso_2022_Jp_2 => "ISO-2022-JP-2",
88            Iso_8859_6_E => "ISO-8859-6-E",
89            Iso_8859_6_I => "ISO-8859-6-I",
90            Iso_8859_8_E => "ISO-8859-8-E",
91            Iso_8859_8_I => "ISO-8859-8-I",
92            Gb2312 => "GB2312",
93            Big5 => "5",
94            Koi8_R => "KOI8-R",
95            Ext(ref s) => s
96        }
97    }
98}
99
100impl Display for Charset {
101    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
102        f.write_str(self.name())
103    }
104}
105
106impl FromStr for Charset {
107    type Err = ::Error;
108    fn from_str(s: &str) -> ::Result<Charset> {
109        Ok(match s.to_ascii_uppercase().as_ref() {
110            "US-ASCII" => Us_Ascii,
111            "ISO-8859-1" => Iso_8859_1,
112            "ISO-8859-2" => Iso_8859_2,
113            "ISO-8859-3" => Iso_8859_3,
114            "ISO-8859-4" => Iso_8859_4,
115            "ISO-8859-5" => Iso_8859_5,
116            "ISO-8859-6" => Iso_8859_6,
117            "ISO-8859-7" => Iso_8859_7,
118            "ISO-8859-8" => Iso_8859_8,
119            "ISO-8859-9" => Iso_8859_9,
120            "ISO-8859-10" => Iso_8859_10,
121            "SHIFT-JIS" => Shift_Jis,
122            "EUC-JP" => Euc_Jp,
123            "ISO-2022-KR" => Iso_2022_Kr,
124            "EUC-KR" => Euc_Kr,
125            "ISO-2022-JP" => Iso_2022_Jp,
126            "ISO-2022-JP-2" => Iso_2022_Jp_2,
127            "ISO-8859-6-E" => Iso_8859_6_E,
128            "ISO-8859-6-I" => Iso_8859_6_I,
129            "ISO-8859-8-E" => Iso_8859_8_E,
130            "ISO-8859-8-I" => Iso_8859_8_I,
131            "GB2312" => Gb2312,
132            "5" => Big5,
133            "KOI8-R" => Koi8_R,
134            s => Ext(s.to_owned())
135        })
136    }
137}
138
139#[test]
140fn test_parse() {
141    assert_eq!(Us_Ascii,"us-ascii".parse().unwrap());
142    assert_eq!(Us_Ascii,"US-Ascii".parse().unwrap());
143    assert_eq!(Us_Ascii,"US-ASCII".parse().unwrap());
144    assert_eq!(Shift_Jis,"Shift-JIS".parse().unwrap());
145    assert_eq!(Ext("ABCD".to_owned()),"abcd".parse().unwrap());
146}
147
148#[test]
149fn test_display() {
150    assert_eq!("US-ASCII", format!("{}", Us_Ascii));
151    assert_eq!("ABCD", format!("{}", Ext("ABCD".to_owned())));
152}