1
2#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
4pub enum ControlPictures {
5 SymbolForNull,
7 SymbolForStartOfHeading,
9 SymbolForStartOfText,
11 SymbolForEndOfText,
13 SymbolForEndOfTransmission,
15 SymbolForEnquiry,
17 SymbolForAcknowledge,
19 SymbolForBell,
21 SymbolForBackspace,
23 SymbolForHorizontalTabulation,
25 SymbolForLineFeed,
27 SymbolForVerticalTabulation,
29 SymbolForFormFeed,
31 SymbolForCarriageReturn,
33 SymbolForShiftOut,
35 SymbolForShiftIn,
37 SymbolForDataLinkEscape,
39 SymbolForDeviceControlOne,
41 SymbolForDeviceControlTwo,
43 SymbolForDeviceControlThree,
45 SymbolForDeviceControlFour,
47 SymbolForNegativeAcknowledge,
49 SymbolForSynchronousIdle,
51 SymbolForEndOfTransmissionBlock,
53 SymbolForCancel,
55 SymbolForEndOfMedium,
57 SymbolForSubstitute,
59 SymbolForEscape,
61 SymbolForFileSeparator,
63 SymbolForGroupSeparator,
65 SymbolForRecordSeparator,
67 SymbolForUnitSeparator,
69 SymbolForSpace,
71 SymbolForDelete,
73 BlankSymbol,
75 OpenBox,
77 SymbolForNewline,
79 SymbolForDeleteFormTwo,
81 SymbolForSubstituteFormTwo,
83}
84
85impl Into<char> for ControlPictures {
86 fn into(self) -> char {
87 match self {
88 ControlPictures::SymbolForNull => '␀',
89 ControlPictures::SymbolForStartOfHeading => '␁',
90 ControlPictures::SymbolForStartOfText => '␂',
91 ControlPictures::SymbolForEndOfText => '␃',
92 ControlPictures::SymbolForEndOfTransmission => '␄',
93 ControlPictures::SymbolForEnquiry => '␅',
94 ControlPictures::SymbolForAcknowledge => '␆',
95 ControlPictures::SymbolForBell => '␇',
96 ControlPictures::SymbolForBackspace => '␈',
97 ControlPictures::SymbolForHorizontalTabulation => '␉',
98 ControlPictures::SymbolForLineFeed => '␊',
99 ControlPictures::SymbolForVerticalTabulation => '␋',
100 ControlPictures::SymbolForFormFeed => '␌',
101 ControlPictures::SymbolForCarriageReturn => '␍',
102 ControlPictures::SymbolForShiftOut => '␎',
103 ControlPictures::SymbolForShiftIn => '␏',
104 ControlPictures::SymbolForDataLinkEscape => '␐',
105 ControlPictures::SymbolForDeviceControlOne => '␑',
106 ControlPictures::SymbolForDeviceControlTwo => '␒',
107 ControlPictures::SymbolForDeviceControlThree => '␓',
108 ControlPictures::SymbolForDeviceControlFour => '␔',
109 ControlPictures::SymbolForNegativeAcknowledge => '␕',
110 ControlPictures::SymbolForSynchronousIdle => '␖',
111 ControlPictures::SymbolForEndOfTransmissionBlock => '␗',
112 ControlPictures::SymbolForCancel => '␘',
113 ControlPictures::SymbolForEndOfMedium => '␙',
114 ControlPictures::SymbolForSubstitute => '␚',
115 ControlPictures::SymbolForEscape => '␛',
116 ControlPictures::SymbolForFileSeparator => '␜',
117 ControlPictures::SymbolForGroupSeparator => '␝',
118 ControlPictures::SymbolForRecordSeparator => '␞',
119 ControlPictures::SymbolForUnitSeparator => '␟',
120 ControlPictures::SymbolForSpace => '␠',
121 ControlPictures::SymbolForDelete => '␡',
122 ControlPictures::BlankSymbol => '␢',
123 ControlPictures::OpenBox => '␣',
124 ControlPictures::SymbolForNewline => '',
125 ControlPictures::SymbolForDeleteFormTwo => '␥',
126 ControlPictures::SymbolForSubstituteFormTwo => '␦',
127 }
128 }
129}
130
131impl std::convert::TryFrom<char> for ControlPictures {
132 type Error = ();
133 fn try_from(c: char) -> Result<Self, Self::Error> {
134 match c {
135 '␀' => Ok(ControlPictures::SymbolForNull),
136 '␁' => Ok(ControlPictures::SymbolForStartOfHeading),
137 '␂' => Ok(ControlPictures::SymbolForStartOfText),
138 '␃' => Ok(ControlPictures::SymbolForEndOfText),
139 '␄' => Ok(ControlPictures::SymbolForEndOfTransmission),
140 '␅' => Ok(ControlPictures::SymbolForEnquiry),
141 '␆' => Ok(ControlPictures::SymbolForAcknowledge),
142 '␇' => Ok(ControlPictures::SymbolForBell),
143 '␈' => Ok(ControlPictures::SymbolForBackspace),
144 '␉' => Ok(ControlPictures::SymbolForHorizontalTabulation),
145 '␊' => Ok(ControlPictures::SymbolForLineFeed),
146 '␋' => Ok(ControlPictures::SymbolForVerticalTabulation),
147 '␌' => Ok(ControlPictures::SymbolForFormFeed),
148 '␍' => Ok(ControlPictures::SymbolForCarriageReturn),
149 '␎' => Ok(ControlPictures::SymbolForShiftOut),
150 '␏' => Ok(ControlPictures::SymbolForShiftIn),
151 '␐' => Ok(ControlPictures::SymbolForDataLinkEscape),
152 '␑' => Ok(ControlPictures::SymbolForDeviceControlOne),
153 '␒' => Ok(ControlPictures::SymbolForDeviceControlTwo),
154 '␓' => Ok(ControlPictures::SymbolForDeviceControlThree),
155 '␔' => Ok(ControlPictures::SymbolForDeviceControlFour),
156 '␕' => Ok(ControlPictures::SymbolForNegativeAcknowledge),
157 '␖' => Ok(ControlPictures::SymbolForSynchronousIdle),
158 '␗' => Ok(ControlPictures::SymbolForEndOfTransmissionBlock),
159 '␘' => Ok(ControlPictures::SymbolForCancel),
160 '␙' => Ok(ControlPictures::SymbolForEndOfMedium),
161 '␚' => Ok(ControlPictures::SymbolForSubstitute),
162 '␛' => Ok(ControlPictures::SymbolForEscape),
163 '␜' => Ok(ControlPictures::SymbolForFileSeparator),
164 '␝' => Ok(ControlPictures::SymbolForGroupSeparator),
165 '␞' => Ok(ControlPictures::SymbolForRecordSeparator),
166 '␟' => Ok(ControlPictures::SymbolForUnitSeparator),
167 '␠' => Ok(ControlPictures::SymbolForSpace),
168 '␡' => Ok(ControlPictures::SymbolForDelete),
169 '␢' => Ok(ControlPictures::BlankSymbol),
170 '␣' => Ok(ControlPictures::OpenBox),
171 '' => Ok(ControlPictures::SymbolForNewline),
172 '␥' => Ok(ControlPictures::SymbolForDeleteFormTwo),
173 '␦' => Ok(ControlPictures::SymbolForSubstituteFormTwo),
174 _ => Err(()),
175 }
176 }
177}
178
179impl Into<u32> for ControlPictures {
180 fn into(self) -> u32 {
181 let c: char = self.into();
182 let hex = c
183 .escape_unicode()
184 .to_string()
185 .replace("\\u{", "")
186 .replace("}", "");
187 u32::from_str_radix(&hex, 16).unwrap()
188 }
189}
190
191impl std::convert::TryFrom<u32> for ControlPictures {
192 type Error = ();
193 fn try_from(u: u32) -> Result<Self, Self::Error> {
194 if let Ok(c) = char::try_from(u) {
195 Self::try_from(c)
196 } else {
197 Err(())
198 }
199 }
200}
201
202impl Iterator for ControlPictures {
203 type Item = Self;
204 fn next(&mut self) -> Option<Self> {
205 let index: u32 = (*self).into();
206 use std::convert::TryFrom;
207 Self::try_from(index + 1).ok()
208 }
209}
210
211impl ControlPictures {
212 pub fn new() -> Self {
214 ControlPictures::SymbolForNull
215 }
216
217 pub fn name(&self) -> String {
219 let s = std::format!("ControlPictures{:#?}", self);
220 string_morph::to_sentence_case(&s)
221 }
222}