1use std::sync::{Mutex, Once};
2
3use paste::paste;
4
5use super::KnownValuesStore;
6
7#[macro_export]
35macro_rules! const_known_value {
36 ($value:expr, $const_name:ident, $name:expr) => {
37 paste! {
38 pub const [<$const_name _RAW>]: u64 = $value;
39 }
40 pub const $const_name: $crate::KnownValue =
41 $crate::KnownValue::new_with_static_name($value, $name);
42 };
43}
44
45const_known_value!(0, UNIT, "");
52const_known_value!(1, IS_A, "isA");
53const_known_value!(2, ID, "id");
54const_known_value!(3, SIGNED, "signed");
55const_known_value!(4, NOTE, "note");
56const_known_value!(5, HAS_RECIPIENT, "hasRecipient");
57const_known_value!(6, SSKR_SHARE, "sskrShare");
58const_known_value!(7, CONTROLLER, "controller");
59const_known_value!(8, KEY, "key");
60const_known_value!(9, DEREFERENCE_VIA, "dereferenceVia");
61const_known_value!(10, ENTITY, "entity");
62const_known_value!(11, NAME, "name");
63const_known_value!(12, LANGUAGE, "language");
64const_known_value!(13, ISSUER, "issuer");
65const_known_value!(14, HOLDER, "holder");
66const_known_value!(15, SALT, "salt");
67const_known_value!(16, DATE, "date");
68const_known_value!(17, UNKNOWN_VALUE, "Unknown");
69const_known_value!(18, VERSION_VALUE, "version");
70const_known_value!(19, HAS_SECRET, "hasSecret");
71const_known_value!(20, DIFF_EDITS, "edits");
72const_known_value!(21, VALID_FROM, "validFrom");
73const_known_value!(22, VALID_UNTIL, "validUntil");
74const_known_value!(23, POSITION, "position");
75const_known_value!(24, NICKNAME, "nickname");
76const_known_value!(25, VALUE, "value");
77const_known_value!(50, ATTACHMENT, "attachment");
84const_known_value!(51, VENDOR, "vendor");
85const_known_value!(52, CONFORMS_TO, "conformsTo");
86const_known_value!(60, ALLOW, "allow");
93const_known_value!(61, DENY, "deny");
94const_known_value!(62, ENDPOINT, "endpoint");
95const_known_value!(63, DELEGATE, "delegate");
96const_known_value!(64, PROVENANCE, "provenance");
97const_known_value!(65, PRIVATE_KEY, "privateKey");
98const_known_value!(66, SERVICE, "service");
99const_known_value!(67, CAPABILITY, "capability");
100const_known_value!(68, PROVENANCE_GENERATOR, "provenanceGenerator");
101const_known_value!(70, PRIVILEGE_ALL, "All");
108const_known_value!(71, PRIVILEGE_AUTH, "Authorize");
109const_known_value!(72, PRIVILEGE_SIGN, "Sign");
110const_known_value!(73, PRIVILEGE_ENCRYPT, "Encrypt");
111const_known_value!(74, PRIVILEGE_ELIDE, "Elide");
112const_known_value!(75, PRIVILEGE_ISSUE, "Issue");
113const_known_value!(76, PRIVILEGE_ACCESS, "Access");
114const_known_value!(80, PRIVILEGE_DELEGATE, "Delegate");
116const_known_value!(81, PRIVILEGE_VERIFY, "Verify");
117const_known_value!(82, PRIVILEGE_UPDATE, "Update");
118const_known_value!(83, PRIVILEGE_TRANSFER, "Transfer");
119const_known_value!(84, PRIVILEGE_ELECT, "Elect");
120const_known_value!(85, PRIVILEGE_BURN, "Burn");
121const_known_value!(86, PRIVILEGE_REVOKE, "Revoke");
122const_known_value!(100, BODY, "body");
129const_known_value!(101, RESULT, "result");
130const_known_value!(102, ERROR, "error");
131const_known_value!(103, OK_VALUE, "OK");
132const_known_value!(104, PROCESSING_VALUE, "Processing");
133const_known_value!(105, SENDER, "sender");
134const_known_value!(106, SENDER_CONTINUATION, "senderContinuation");
135const_known_value!(107, RECIPIENT_CONTINUATION, "recipientContinuation");
136const_known_value!(108, CONTENT, "content");
137const_known_value!(200, SEED_TYPE, "Seed");
144const_known_value!(201, PRIVATE_KEY_TYPE, "PrivateKey");
145const_known_value!(202, PUBLIC_KEY_TYPE, "PublicKey");
146const_known_value!(203, MASTER_KEY_TYPE, "MasterKey");
147const_known_value!(300, ASSET, "asset");
154const_known_value!(301, BITCOIN_VALUE, "Bitcoin");
155const_known_value!(302, ETHEREUM_VALUE, "Ethereum");
156const_known_value!(303, TEZOS_VALUE, "Tezos");
157const_known_value!(400, NETWORK, "network");
164const_known_value!(401, MAIN_NET_VALUE, "MainNet");
165const_known_value!(402, TEST_NET_VALUE, "TestNet");
166const_known_value!(500, BIP32_KEY_TYPE, "BIP32Key");
173const_known_value!(501, CHAIN_CODE, "chainCode");
174const_known_value!(502, DERIVATION_PATH_TYPE, "DerivationPath");
175const_known_value!(503, PARENT_PATH, "parentPath");
176const_known_value!(504, CHILDREN_PATH, "childrenPath");
177const_known_value!(505, PARENT_FINGERPRINT, "parentFingerprint");
178const_known_value!(506, PSBT_TYPE, "PSBT");
179const_known_value!(507, OUTPUT_DESCRIPTOR_TYPE, "OutputDescriptor");
180const_known_value!(508, OUTPUT_DESCRIPTOR, "outputDescriptor");
181const_known_value!(600, GRAPH, "Graph");
188const_known_value!(601, SOURCE_TARGET_GRAPH, "SourceTargetGraph");
189const_known_value!(602, PARENT_CHILD_GRAPH, "ParentChildGraph");
190const_known_value!(603, DIGRAPH, "Digraph");
191const_known_value!(604, ACYCLIC_GRAPH, "AcyclicGraph");
192const_known_value!(605, MULTIGRAPH, "Multigraph");
193const_known_value!(606, PSEUDOGRAPH, "Pseudograph");
194const_known_value!(607, GRAPH_FRAGMENT, "GraphFragment");
195const_known_value!(608, DAG, "DAG");
196const_known_value!(609, TREE, "Tree");
197const_known_value!(610, FOREST, "Forest");
198const_known_value!(611, COMPOUND_GRAPH, "CompoundGraph");
199const_known_value!(612, HYPERGRAPH, "Hypergraph");
200const_known_value!(613, DIHYPERGRAPH, "Dihypergraph");
201const_known_value!(700, NODE, "node");
203const_known_value!(701, EDGE, "edge");
204const_known_value!(702, SOURCE, "source");
205const_known_value!(703, TARGET, "target");
206const_known_value!(704, PARENT, "parent");
207const_known_value!(705, CHILD, "child");
208const_known_value!(706, SELF, "Self");
209#[doc(hidden)]
228#[derive(Debug)]
229pub struct LazyKnownValues {
230 init: Once,
231 data: Mutex<Option<KnownValuesStore>>,
232}
233
234impl LazyKnownValues {
235 pub fn get(&self) -> std::sync::MutexGuard<'_, Option<KnownValuesStore>> {
247 self.init.call_once(|| {
248 #[allow(unused_mut)]
249 let mut m = KnownValuesStore::new([
250 UNIT,
251 IS_A,
252 ID,
253 SIGNED,
254 NOTE,
255 HAS_RECIPIENT,
256 SSKR_SHARE,
257 CONTROLLER,
258 KEY,
259 DEREFERENCE_VIA,
260 ENTITY,
261 NAME,
262 LANGUAGE,
263 ISSUER,
264 HOLDER,
265 SALT,
266 DATE,
267 UNKNOWN_VALUE,
268 VERSION_VALUE,
269 HAS_SECRET,
270 DIFF_EDITS,
271 VALID_FROM,
272 VALID_UNTIL,
273 POSITION,
274 NICKNAME,
275 ATTACHMENT,
276 VENDOR,
277 CONFORMS_TO,
278 ALLOW,
279 DENY,
280 ENDPOINT,
281 DELEGATE,
282 PROVENANCE,
283 PRIVATE_KEY,
284 SERVICE,
285 CAPABILITY,
286 PROVENANCE_GENERATOR,
287 PRIVILEGE_ALL,
288 PRIVILEGE_AUTH,
289 PRIVILEGE_SIGN,
290 PRIVILEGE_ENCRYPT,
291 PRIVILEGE_ELIDE,
292 PRIVILEGE_ISSUE,
293 PRIVILEGE_ACCESS,
294 PRIVILEGE_DELEGATE,
295 PRIVILEGE_VERIFY,
296 PRIVILEGE_UPDATE,
297 PRIVILEGE_TRANSFER,
298 PRIVILEGE_ELECT,
299 PRIVILEGE_BURN,
300 PRIVILEGE_REVOKE,
301 BODY,
302 RESULT,
303 ERROR,
304 OK_VALUE,
305 PROCESSING_VALUE,
306 SENDER,
307 SENDER_CONTINUATION,
308 RECIPIENT_CONTINUATION,
309 CONTENT,
310 SEED_TYPE,
311 PRIVATE_KEY_TYPE,
312 PUBLIC_KEY_TYPE,
313 MASTER_KEY_TYPE,
314 ASSET,
315 BITCOIN_VALUE,
316 ETHEREUM_VALUE,
317 TEZOS_VALUE,
318 NETWORK,
319 MAIN_NET_VALUE,
320 TEST_NET_VALUE,
321 BIP32_KEY_TYPE,
322 CHAIN_CODE,
323 DERIVATION_PATH_TYPE,
324 PARENT_PATH,
325 CHILDREN_PATH,
326 PARENT_FINGERPRINT,
327 PSBT_TYPE,
328 OUTPUT_DESCRIPTOR_TYPE,
329 OUTPUT_DESCRIPTOR,
330 GRAPH,
331 SOURCE_TARGET_GRAPH,
332 PARENT_CHILD_GRAPH,
333 DIGRAPH,
334 ACYCLIC_GRAPH,
335 MULTIGRAPH,
336 PSEUDOGRAPH,
337 GRAPH_FRAGMENT,
338 DAG,
339 TREE,
340 FOREST,
341 COMPOUND_GRAPH,
342 HYPERGRAPH,
343 DIHYPERGRAPH,
344 NODE,
345 EDGE,
346 SOURCE,
347 TARGET,
348 PARENT,
349 CHILD,
350 ]);
351
352 #[cfg(feature = "directory-loading")]
356 {
357 let config = crate::directory_loader::get_and_lock_config();
358 let result = crate::directory_loader::load_from_config(&config);
359 for value in result.into_values() {
360 m.insert(value);
361 }
362 }
363
364 *self.data.lock().unwrap() = Some(m);
365 });
366 self.data.lock().unwrap()
367 }
368}
369
370pub static KNOWN_VALUES: LazyKnownValues =
392 LazyKnownValues { init: Once::new(), data: Mutex::new(None) };
393
394#[cfg(test)]
395mod tests {
396 #[test]
397 fn test_1() {
398 assert_eq!(crate::IS_A.value(), 1);
399 assert_eq!(crate::IS_A.name(), "isA");
400 let binding = crate::KNOWN_VALUES.get();
401 let known_values = binding.as_ref().unwrap();
402 assert_eq!(known_values.known_value_named("isA").unwrap().value(), 1);
403 }
404}