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