cogo_http/header/shared/
charset.rs1use std::fmt::{self, Display};
2use std::str::FromStr;
3
4#[allow(unused_imports)]
5use std::ascii::AsciiExt;
6
7use self::Charset::*;
8
9#[derive(Clone,Debug,PartialEq)]
15#[allow(non_camel_case_types)]
16pub enum Charset{
17 Us_Ascii,
19 Iso_8859_1,
21 Iso_8859_2,
23 Iso_8859_3,
25 Iso_8859_4,
27 Iso_8859_5,
29 Iso_8859_6,
31 Iso_8859_7,
33 Iso_8859_8,
35 Iso_8859_9,
37 Iso_8859_10,
39 Shift_Jis,
41 Euc_Jp,
43 Iso_2022_Kr,
45 Euc_Kr,
47 Iso_2022_Jp,
49 Iso_2022_Jp_2,
51 Iso_8859_6_E,
53 Iso_8859_6_I,
55 Iso_8859_8_E,
57 Iso_8859_8_I,
59 Gb2312,
61 Big5,
63 Koi8_R,
65 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}