cogo_http/header/shared/
charset.rs

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