1mod value;
2use derive_more::Display;
3pub use value::Value;
4#[derive(Clone, Debug, Copy, PartialEq, Eq, Ord, PartialOrd, Display, Hash)]
5pub struct Attribute<'a>(&'a str);
6
7pub struct InvalidKeyError {}
8
9macro_rules! key {
10 ($name:ident $tag:expr) => {
11 pub const $name: Attribute<'static> = Attribute($tag);
12 };
13}
14
15impl<'a> Attribute<'a> {
16 pub fn create(attribute: &'a str) -> Result<Attribute<'a>, InvalidKeyError> {
18 match attribute.chars().all(char::is_alphabetic) {
19 false => Err(InvalidKeyError {}),
20 true => Ok(Attribute(attribute)),
21 }
22 }
23
24 key!(ACCEPT "accept");
25 key!(ACCEPT_CHARSET "accept-charset");
26 key!(ACCESSKEY "accesskey");
27 key!(ACTION "action");
28 key!(ALIGN "align");
29 key!(ALLOW "allow");
30 key!(ALT "alt");
31 key!(ASYNC "async");
32 key!(AUTOCAPITALIZE "autocapitalize");
33 key!(AUTOCOMPLETE "autocomplete");
34 key!(AUTOFOCUS "autofocus");
35 key!(AUTOPLAY "autoplay");
36 key!(BACKGROUND "background");
37 key!(BGCOLOR "bgcolor");
38 key!(BORDER "border");
39 key!(BUFFERED "buffered");
40 key!(CAPTURE "capture");
41 key!(CHALLENGE "challenge");
42 key!(CHARSET "charset");
43 key!(CHECKED "checked");
44 key!(CITE "cite");
45 key!(CLASS "class");
46 key!(CODE "code");
47 key!(CODEBASE "codebase");
48 key!(COLOR "color");
49 key!(COLS "cols");
50 key!(COLSPAN "colspan");
51 key!(CONTENT "content");
52 key!(CONTENTEDITABLE "contenteditable");
53 key!(CONTEXTMENU "contextmenu");
54 key!(CONTROLS "controls");
55 key!(COORDS "coords");
56 key!(CROSSORIGIN "crossorigin");
57 key!(CSP "csp");
58 key!(DATA "data");
59 key!(DATETIME "datetime");
60 key!(DECODING "decoding");
61 key!(DEFAULT "default");
62 key!(DEFER "defer");
63 key!(DIR "dir");
64 key!(DIRNAME "dirname");
65 key!(DISABLED "disabled");
66 key!(DOWNLOAD "download");
67 key!(DRAGGABLE "draggable");
68 key!(DROPZONE "dropzone");
69 key!(ENCTYPE "enctype");
70 key!(ENTERKEYHINT "enterkeyhint");
71 key!(FOR "for");
72 key!(FORM "form");
73 key!(FORMACTION "formaction");
74 key!(FORMENCTYPE "formenctype");
75 key!(FORMMETHOD "formmethod");
76 key!(FORMNOVALIDATE "formnovalidate");
77 key!(FORMTARGET "formtarget");
78 key!(HEADERS "headers");
79 key!(HEIGHT "height");
80 key!(HIDDEN "hidden");
81 key!(HIGH "high");
82 key!(HREF "href");
83 key!(HREFLANG "hreflang");
84 key!(HTTP_EQUIV "http-equiv");
85 key!(ICON "icon");
86 key!(ID "id");
87 key!(IMPORTANCE "importance");
88 key!(INTEGRITY "integrity");
89 key!(INTRINSICSIZE "intrinsicsize");
90 key!(INPUTMODE "inputmode");
91 key!(ISMAP "ismap");
92 key!(ITEMPROP "itemprop");
93 key!(KEYTYPE "keytype");
94 key!(KIND "kind");
95 key!(LABEL "label");
96 key!(LANG "lang");
97 key!(LANGUAGE "language");
98 key!(LOADING "loading");
99 key!(LIST "list");
100 key!(LOOP "loop");
101 key!(LOW "low");
102 key!(MANIFEST "manifest");
103 key!(MAX "max");
104 key!(MAXLENGTH "maxlength");
105 key!(MINLENGTH "minlength");
106 key!(MEDIA "media");
107 key!(METHOD "method");
108 key!(MIN "min");
109 key!(MULTIPLE "multiple");
110 key!(MUTED "muted");
111 key!(NAME "name");
112 key!(NOVALIDATE "novalidate");
113 key!(OPEN "open");
114 key!(OPTIMUM "optimum");
115 key!(PATTERN "pattern");
116 key!(PING "ping");
117 key!(PLACEHOLDER "placeholder");
118 key!(POSTER "poster");
119 key!(PRELOAD "preload");
120 key!(RADIOGROUP "radiogroup");
121 key!(READONLY "readonly");
122 key!(REFERRERPOLICY "referrerpolicy");
123 key!(REL "rel");
124 key!(REQUIRED "required");
125 key!(REVERSED "ol");
126 key!(ROWS "rows");
127 key!(ROWSPAN "rowspan");
128 key!(SANDBOX "sandbox");
129 key!(SCOPE "scope");
130 key!(SCOPED "scoped");
131 key!(SELECTED "selected");
132 key!(SHAPE "shape");
133 key!(SIZE "size");
134 key!(SIZES "sizes");
135 key!(SLOT "slot");
136 key!(SPAN "span");
137 key!(SPELLCHECK "spellcheck");
138 key!(SRC "src");
139 key!(SRCDOC "srcdoc");
140 key!(SRCLANG "srclang");
141 key!(SRCSET "srcset");
142 key!(START "start");
143 key!(STEP "step");
144 key!(STYLE "style");
145 key!(SUMMARY "summary");
146 key!(TABINDEX "tabindex");
147 key!(TARGET "target");
148 key!(TITLE "title");
149 key!(TRANSLATE "translate");
150 key!(TYPE "type");
151 key!(USEMAP "usemap");
152 key!(VALUE "value");
153 key!(WIDTH "width");
154 key!(WRAP "wrap");
155}