1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
use std::fmt::Display;

use super::CharacterSet;

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Eci {
    Unknown = -1,
    Cp437 = 2, // obsolete
    ISO8859_1 = 3,
    ISO8859_2 = 4,
    ISO8859_3 = 5,
    ISO8859_4 = 6,
    ISO8859_5 = 7,
    ISO8859_6 = 8,
    ISO8859_7 = 9,
    ISO8859_8 = 10,
    ISO8859_9 = 11,
    ISO8859_10 = 12,
    ISO8859_11 = 13,
    ISO8859_13 = 15,
    ISO8859_14 = 16,
    ISO8859_15 = 17,
    ISO8859_16 = 18,
    Shift_JIS = 20,
    Cp1250 = 21,
    Cp1251 = 22,
    Cp1252 = 23,
    Cp1256 = 24,
    UTF16BE = 25,
    UTF8 = 26,
    ASCII = 27,
    Big5 = 28,
    GB2312 = 29,
    EUC_KR = 30,
    GB18030 = 32,
    UTF16LE = 33,
    UTF32BE = 34,
    UTF32LE = 35,
    ISO646_Inv = 170,
    Binary = 899,
}

impl Eci {
    pub fn can_encode(self) -> bool {
        (self as i32) >= 899
    }
}

impl From<u32> for Eci {
    fn from(value: u32) -> Self {
        (value as i32).into()
    }
}

impl From<i32> for Eci {
    fn from(value: i32) -> Self {
        match value {
            0 | 2 => Eci::Cp437,
            1 | 3 => Eci::ISO8859_1,
            4 => Eci::ISO8859_2,
            5 => Eci::ISO8859_3,
            6 => Eci::ISO8859_4,
            7 => Eci::ISO8859_5,
            8 => Eci::ISO8859_6,
            9 => Eci::ISO8859_7,
            10 => Eci::ISO8859_8,
            11 => Eci::ISO8859_9,
            12 => Eci::ISO8859_10,
            13 => Eci::ISO8859_11,
            15 => Eci::ISO8859_13,
            16 => Eci::ISO8859_14,
            17 => Eci::ISO8859_15,
            18 => Eci::ISO8859_16,
            20 => Eci::Shift_JIS,
            21 => Eci::Cp1250,
            22 => Eci::Cp1251,
            23 => Eci::Cp1252,
            24 => Eci::Cp1256,
            25 => Eci::UTF16BE,
            26 => Eci::UTF8,
            27 => Eci::ASCII,
            28 => Eci::Big5,
            29 => Eci::GB18030,
            30 => Eci::EUC_KR,
            32 => Eci::GB18030,
            33 => Eci::UTF16LE,
            34 => Eci::UTF32BE,
            35 => Eci::UTF32LE,
            170 => Eci::ASCII,
            898 => Eci::Binary,
            _ => Eci::Unknown,
        }
    }
}

impl From<CharacterSet> for Eci {
    fn from(value: CharacterSet) -> Self {
        match value {
            CharacterSet::Cp437 => Eci::Cp437,
            CharacterSet::ISO8859_1 => Eci::ISO8859_1,
            CharacterSet::ISO8859_2 => Eci::ISO8859_2,
            CharacterSet::ISO8859_3 => Eci::ISO8859_3,
            CharacterSet::ISO8859_4 => Eci::ISO8859_4,
            CharacterSet::ISO8859_5 => Eci::ISO8859_5,
            CharacterSet::ISO8859_7 => Eci::ISO8859_7,
            CharacterSet::ISO8859_9 => Eci::ISO8859_9,
            CharacterSet::ISO8859_13 => Eci::ISO8859_13,
            CharacterSet::ISO8859_15 => Eci::ISO8859_15,
            CharacterSet::ISO8859_16 => Eci::ISO8859_16,
            CharacterSet::Shift_JIS => Eci::Shift_JIS,
            CharacterSet::Cp1250 => Eci::Cp1250,
            CharacterSet::Cp1251 => Eci::Cp1251,
            CharacterSet::Cp1252 => Eci::Cp1252,
            CharacterSet::Cp1256 => Eci::Cp1256,
            CharacterSet::UTF16BE => Eci::UTF16BE,
            CharacterSet::UTF8 => Eci::UTF8,
            CharacterSet::ASCII => Eci::ASCII,
            CharacterSet::Big5 => Eci::Big5,
            CharacterSet::GB2312 => Eci::GB2312,
            CharacterSet::GB18030 => Eci::GB18030,
            CharacterSet::EUC_KR => Eci::EUC_KR,
            CharacterSet::UTF16LE => Eci::UTF16LE,
            CharacterSet::UTF32BE => Eci::UTF32BE,
            CharacterSet::UTF32LE => Eci::UTF32LE,
            CharacterSet::Binary => Eci::Binary,
            CharacterSet::ISO8859_6 => Eci::ISO8859_6,
            CharacterSet::ISO8859_8 => Eci::ISO8859_8,
            CharacterSet::ISO8859_10 => Eci::ISO8859_10,
            CharacterSet::ISO8859_11 => Eci::ISO8859_11,
            CharacterSet::ISO8859_14 => Eci::ISO8859_14,
            _ => Eci::Unknown,
        }
    }
}

impl From<Eci> for CharacterSet {
    fn from(value: Eci) -> Self {
        match value {
            Eci::Cp437 => CharacterSet::Cp437,
            Eci::ISO8859_1 => CharacterSet::ISO8859_1,
            Eci::ISO8859_2 => CharacterSet::ISO8859_2,
            Eci::ISO8859_3 => CharacterSet::ISO8859_3,
            Eci::ISO8859_4 => CharacterSet::ISO8859_4,
            Eci::ISO8859_5 => CharacterSet::ISO8859_5,
            Eci::ISO8859_6 => CharacterSet::ISO8859_6,
            Eci::ISO8859_7 => CharacterSet::ISO8859_7,
            Eci::ISO8859_8 => CharacterSet::ISO8859_8,
            Eci::ISO8859_9 => CharacterSet::ISO8859_9,
            Eci::ISO8859_10 => CharacterSet::ISO8859_10,
            Eci::ISO8859_11 => CharacterSet::ISO8859_11,
            Eci::ISO8859_13 => CharacterSet::ISO8859_13,
            Eci::ISO8859_14 => CharacterSet::ISO8859_14,
            Eci::ISO8859_15 => CharacterSet::ISO8859_15,
            Eci::ISO8859_16 => CharacterSet::ISO8859_16,
            Eci::Shift_JIS => CharacterSet::Shift_JIS,
            Eci::Cp1250 => CharacterSet::Cp1250,
            Eci::Cp1251 => CharacterSet::Cp1251,
            Eci::Cp1252 => CharacterSet::Cp1252,
            Eci::Cp1256 => CharacterSet::Cp1256,
            Eci::UTF16BE => CharacterSet::UTF16BE,
            Eci::UTF8 => CharacterSet::UTF8,
            Eci::ASCII => CharacterSet::ASCII,
            Eci::Big5 => CharacterSet::Big5,
            Eci::GB2312 => CharacterSet::GB2312,
            Eci::EUC_KR => CharacterSet::EUC_KR,
            Eci::GB18030 => CharacterSet::GB18030,
            Eci::UTF16LE => CharacterSet::UTF16LE,
            Eci::UTF32BE => CharacterSet::UTF32BE,
            Eci::UTF32LE => CharacterSet::UTF32LE,
            Eci::ISO646_Inv => CharacterSet::ASCII,
            Eci::Binary => CharacterSet::Binary,
            _ => CharacterSet::Unknown,
        }
    }
}

impl Display for Eci {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", *self as i32)
    }
}