autosar_data_specification/
attributename.rs

1use crate::hashfunc;
2
3#[derive(Debug)]
4/// The error type `ParseAttributeNameError` is returned when `from_str()` / `parse()` fails for `AttributeName`
5pub 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]
12/// Enum of all attribute names in Autosar
13pub enum AttributeName {
14    /// ACCESSKEY
15    Accesskey               = 79,
16    /// ALIGN
17    Align                   = 72,
18    /// ALLOW-BREAK
19    AllowBreak              = 15,
20    /// ALT
21    Alt                     = 46,
22    /// BASE
23    Base                    = 40,
24    /// BGCOLOR
25    Bgcolor                 = 41,
26    /// BINDING-TIME
27    BindingTime             = 18,
28    /// BLUEPRINT-VALUE
29    BlueprintValue          = 23,
30    /// BREAK
31    Break                   = 22,
32    /// CLASS
33    Class                   = 8,
34    /// COLNAME
35    Colname                 = 74,
36    /// COLNUM
37    Colnum                  = 47,
38    /// COLOR
39    Color                   = 26,
40    /// COLS
41    Cols                    = 88,
42    /// COLSEP
43    Colsep                  = 86,
44    /// COLWIDTH
45    Colwidth                = 65,
46    /// COORDS
47    Coords                  = 25,
48    /// DEST
49    Dest                    = 6,
50    /// EDIT-HEIGHT
51    EditHeight              = 90,
52    /// EDIT-WIDTH
53    EditWidth               = 20,
54    /// EDITFIT
55    Editfit                 = 21,
56    /// EDITSCALE
57    Editscale               = 83,
58    /// ENUM-TABLE
59    EnumTable               = 35,
60    /// FILENAME
61    Filename                = 31,
62    /// FIT
63    Fit                     = 68,
64    /// FLOAT
65    Float                   = 42,
66    /// FONT
67    Font                    = 61,
68    /// FRAME
69    Frame                   = 14,
70    /// GENERATOR
71    Generator               = 63,
72    /// GID
73    Gid                     = 51,
74    /// HEIGHT
75    Height                  = 16,
76    /// HELP-ENTRY
77    HelpEntry               = 58,
78    /// HREF
79    Href                    = 67,
80    /// HTML-FIT
81    HtmlFit                 = 55,
82    /// HTML-HEIGHT
83    HtmlHeight              = 97,
84    /// HTML-SCALE
85    HtmlScale               = 85,
86    /// HTML-WIDTH
87    HtmlWidth               = 69,
88    /// INDEX
89    Index                   = 32,
90    /// INTERVAL-TYPE
91    IntervalType            = 60,
92    /// ITEM-LABEL-POS
93    ItemLabelPos            = 70,
94    /// KEEP-WITH-PREVIOUS
95    KeepWithPrevious        = 54,
96    /// L
97    L                       = 43,
98    /// LEVEL
99    Level                   = 50,
100    /// MIME-TYPE
101    MimeType                = 96,
102    /// MOREROWS
103    Morerows                = 3,
104    /// NAME
105    Name                    = 33,
106    /// NAME-PATTERN
107    NamePattern             = 89,
108    /// NAMEEND
109    Nameend                 = 81,
110    /// NAMEST
111    Namest                  = 19,
112    /// NOHREF
113    Nohref                  = 0,
114    /// NOTATION
115    Notation                = 87,
116    /// NOTE-TYPE
117    NoteType                = 44,
118    /// ONBLUR
119    Onblur                  = 5,
120    /// ONCLICK
121    Onclick                 = 98,
122    /// ONDBLCLICK
123    Ondblclick              = 12,
124    /// ONFOCUS
125    Onfocus                 = 100,
126    /// ONKEYDOWN
127    Onkeydown               = 95,
128    /// ONKEYPRESS
129    Onkeypress              = 73,
130    /// ONKEYUP
131    Onkeyup                 = 37,
132    /// ONMOUSEDOWN
133    Onmousedown             = 64,
134    /// ONMOUSEMOVE
135    Onmousemove             = 71,
136    /// ONMOUSEOUT
137    Onmouseout              = 1,
138    /// ONMOUSEOVER
139    Onmouseover             = 56,
140    /// ONMOUSEUP
141    Onmouseup               = 39,
142    /// ORIENT
143    Orient                  = 30,
144    /// PGWIDE
145    Pgwide                  = 29,
146    /// RESOLUTION-POLICY
147    ResolutionPolicy        = 91,
148    /// ROTATE
149    Rotate                  = 57,
150    /// ROWSEP
151    Rowsep                  = 13,
152    /// S
153    S                       = 52,
154    /// SCALE
155    Scale                   = 76,
156    /// SD
157    Sd                      = 92,
158    /// SHAPE
159    Shape                   = 38,
160    /// SHORT-LABEL
161    ShortLabel              = 11,
162    /// SHOW-CONTENT
163    ShowContent             = 36,
164    /// SHOW-RESOURCE-ALIAS-NAME
165    ShowResourceAliasName   = 75,
166    /// SHOW-RESOURCE-CATEGORY
167    ShowResourceCategory    = 27,
168    /// SHOW-RESOURCE-LONG-NAME
169    ShowResourceLongName    = 53,
170    /// SHOW-RESOURCE-NUMBER
171    ShowResourceNumber      = 10,
172    /// SHOW-RESOURCE-PAGE
173    ShowResourcePage        = 7,
174    /// SHOW-RESOURCE-SHORT-NAME
175    ShowResourceShortName   = 9,
176    /// SHOW-RESOURCE-TYPE
177    ShowResourceType        = 2,
178    /// SHOW-SEE
179    ShowSee                 = 99,
180    /// SI
181    Si                      = 77,
182    /// SPANNAME
183    Spanname                = 4,
184    /// STYLE
185    Style                   = 45,
186    /// T
187    T                       = 80,
188    /// TABINDEX
189    Tabindex                = 93,
190    /// TABSTYLE
191    Tabstyle                = 48,
192    /// TEX-RENDER
193    TexRender               = 66,
194    /// TITLE
195    Title                   = 94,
196    /// TYPE
197    Type                    = 34,
198    /// UUID
199    Uuid                    = 59,
200    /// VALIDITY
201    Validity                = 84,
202    /// VALIGN
203    Valign                  = 49,
204    /// VIEW
205    View                    = 24,
206    /// WIDTH
207    Width                   = 62,
208    /// xml:space
209    xmlSpace                = 82,
210    /// xmlns
211    xmlns                   = 28,
212    /// xmlns:xsi
213    xmlnsXsi                = 17,
214    /// xsi:schemaLocation
215    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    /// derive an enum entry from an input string using a perfect hash function
223    ///
224    /// # Errors
225    ///
226    /// [`ParseAttributeNameError`]: The input string did not match the name of any enum item
227    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    /// get the str corresponding to an item
244    ///
245    /// The returned &str has static lifetime, becasue it is a reference to an entry in a list of constants
246    #[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}