1use crate::hashfunc;
2
3#[derive(Debug)]
4pub struct ParseAttributeNameError;
6
7#[allow(dead_code, non_camel_case_types)]
8#[derive(Clone, Copy, Eq, PartialEq, Hash)]
9#[repr(u16)]
10#[non_exhaustive]
11#[rustfmt::skip]
12pub enum AttributeName {
14 Accesskey = 79,
16 Align = 72,
18 AllowBreak = 15,
20 Alt = 46,
22 Base = 40,
24 Bgcolor = 41,
26 BindingTime = 18,
28 BlueprintValue = 23,
30 Break = 22,
32 Class = 8,
34 Colname = 74,
36 Colnum = 47,
38 Color = 26,
40 Cols = 88,
42 Colsep = 86,
44 Colwidth = 65,
46 Coords = 25,
48 Dest = 6,
50 EditHeight = 90,
52 EditWidth = 20,
54 Editfit = 21,
56 Editscale = 83,
58 EnumTable = 35,
60 Filename = 31,
62 Fit = 68,
64 Float = 42,
66 Font = 61,
68 Frame = 14,
70 Generator = 63,
72 Gid = 51,
74 Height = 16,
76 HelpEntry = 58,
78 Href = 67,
80 HtmlFit = 55,
82 HtmlHeight = 97,
84 HtmlScale = 85,
86 HtmlWidth = 69,
88 Index = 32,
90 IntervalType = 60,
92 ItemLabelPos = 70,
94 KeepWithPrevious = 54,
96 L = 43,
98 Level = 50,
100 MimeType = 96,
102 Morerows = 3,
104 Name = 33,
106 NamePattern = 89,
108 Nameend = 81,
110 Namest = 19,
112 Nohref = 0,
114 Notation = 87,
116 NoteType = 44,
118 Onblur = 5,
120 Onclick = 98,
122 Ondblclick = 12,
124 Onfocus = 100,
126 Onkeydown = 95,
128 Onkeypress = 73,
130 Onkeyup = 37,
132 Onmousedown = 64,
134 Onmousemove = 71,
136 Onmouseout = 1,
138 Onmouseover = 56,
140 Onmouseup = 39,
142 Orient = 30,
144 Pgwide = 29,
146 ResolutionPolicy = 91,
148 Rotate = 57,
150 Rowsep = 13,
152 S = 52,
154 Scale = 76,
156 Sd = 92,
158 Shape = 38,
160 ShortLabel = 11,
162 ShowContent = 36,
164 ShowResourceAliasName = 75,
166 ShowResourceCategory = 27,
168 ShowResourceLongName = 53,
170 ShowResourceNumber = 10,
172 ShowResourcePage = 7,
174 ShowResourceShortName = 9,
176 ShowResourceType = 2,
178 ShowSee = 99,
180 Si = 77,
182 Spanname = 4,
184 Style = 45,
186 T = 80,
188 Tabindex = 93,
190 Tabstyle = 48,
192 TexRender = 66,
194 Title = 94,
196 Type = 34,
198 Uuid = 59,
200 Validity = 84,
202 Valign = 49,
204 View = 24,
206 Width = 62,
208 xmlSpace = 82,
210 xmlns = 28,
212 xmlnsXsi = 17,
214 xsiSchemalocation = 78,
216}
217
218impl AttributeName {
219 #[rustfmt::skip]
220 const STRING_TABLE: [&'static str; 101] = ["NOHREF", "ONMOUSEOUT", "SHOW-RESOURCE-TYPE", "MOREROWS", "SPANNAME", "ONBLUR", "DEST", "SHOW-RESOURCE-PAGE", "CLASS", "SHOW-RESOURCE-SHORT-NAME", "SHOW-RESOURCE-NUMBER", "SHORT-LABEL", "ONDBLCLICK", "ROWSEP", "FRAME", "ALLOW-BREAK", "HEIGHT", "xmlns:xsi", "BINDING-TIME", "NAMEST", "EDIT-WIDTH", "EDITFIT", "BREAK", "BLUEPRINT-VALUE", "VIEW", "COORDS", "COLOR", "SHOW-RESOURCE-CATEGORY", "xmlns", "PGWIDE", "ORIENT", "FILENAME", "INDEX", "NAME", "TYPE", "ENUM-TABLE", "SHOW-CONTENT", "ONKEYUP", "SHAPE", "ONMOUSEUP", "BASE", "BGCOLOR", "FLOAT", "L", "NOTE-TYPE", "STYLE", "ALT", "COLNUM", "TABSTYLE", "VALIGN", "LEVEL", "GID", "S", "SHOW-RESOURCE-LONG-NAME", "KEEP-WITH-PREVIOUS", "HTML-FIT", "ONMOUSEOVER", "ROTATE", "HELP-ENTRY", "UUID", "INTERVAL-TYPE", "FONT", "WIDTH", "GENERATOR", "ONMOUSEDOWN", "COLWIDTH", "TEX-RENDER", "HREF", "FIT", "HTML-WIDTH", "ITEM-LABEL-POS", "ONMOUSEMOVE", "ALIGN", "ONKEYPRESS", "COLNAME", "SHOW-RESOURCE-ALIAS-NAME", "SCALE", "SI", "xsi:schemaLocation", "ACCESSKEY", "T", "NAMEEND", "xml:space", "EDITSCALE", "VALIDITY", "HTML-SCALE", "COLSEP", "NOTATION", "COLS", "NAME-PATTERN", "EDIT-HEIGHT", "RESOLUTION-POLICY", "SD", "TABINDEX", "TITLE", "ONKEYDOWN", "MIME-TYPE", "HTML-HEIGHT", "ONCLICK", "SHOW-SEE", "ONFOCUS"];
221
222 pub fn from_bytes(input: &[u8]) -> Result<Self, ParseAttributeNameError> {
228 #[rustfmt::skip]
229 static DISPLACEMENTS: [(u16, u16); 21] = [(0, 0), (0, 1), (0, 21), (0, 55), (0, 52), (0, 46), (0, 29), (0, 6), (0, 4), (1, 42), (0, 57), (0, 82), (0, 64), (0, 21), (12, 82), (1, 87), (22, 29), (7, 30), (0, 0), (44, 96), (64, 36)];
230
231 let (g, f1, f2) = hashfunc(input);
232 let (d1, d2) = DISPLACEMENTS[(g % 21) as usize];
233 let item_idx = u32::from(d2)
234 .wrapping_add(f1.wrapping_mul(u32::from(d1)))
235 .wrapping_add(f2) as usize
236 % 101;
237 if AttributeName::STRING_TABLE[item_idx].as_bytes() != input {
238 return Err(ParseAttributeNameError);
239 }
240 Ok(unsafe { core::mem::transmute::<u16, Self>(item_idx as u16) })
241 }
242
243 #[must_use]
247 pub fn to_str(&self) -> &'static str {
248 AttributeName::STRING_TABLE[*self as usize]
249 }
250}
251
252impl core::str::FromStr for AttributeName {
253 type Err = ParseAttributeNameError;
254 fn from_str(input: &str) -> Result<Self, Self::Err> {
255 Self::from_bytes(input.as_bytes())
256 }
257}
258
259impl core::fmt::Debug for AttributeName {
260 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
261 f.write_str(AttributeName::STRING_TABLE[*self as usize])
262 }
263}
264
265impl core::fmt::Display for AttributeName {
266 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
267 f.write_str(AttributeName::STRING_TABLE[*self as usize])
268 }
269}