sdml_core/stdlib/
macros.rs

1/*!
2Macros used to build standard library modules.
3 */
4
5// ------------------------------------------------------------------------------------------------
6// Public Macros ❱ URLs
7// ------------------------------------------------------------------------------------------------
8
9macro_rules! library_module_url {
10    ($authority:expr, $path:expr) => {
11        pub const MODULE_URL: &str =
12            concat!("https://sdml.io/stdlib/", $authority, "/", $path, "#");
13    };
14}
15
16// ------------------------------------------------------------------------------------------------
17// Public Macros ❱ Identifiers
18// ------------------------------------------------------------------------------------------------
19
20#[macro_export]
21macro_rules! id {
22    (unchecked $id1:ident : $id2:ident) => {
23        $crate::model::identifiers::QualifiedIdentifier::new_unchecked(
24            stringify!($id1),
25            stringify!($id2),
26        )
27    };
28    (unchecked $id1:expr, $id2:expr) => {
29        $crate::model::identifiers::QualifiedIdentifier::new_unchecked($id1, $id2)
30    };
31    (unchecked $id:ident) => {
32        $crate::model::identifiers::Identifier::new_unchecked(stringify!($id))
33    };
34    (unchecked $id:expr) => {
35        $crate::model::identifiers::Identifier::new_unchecked($id)
36    };
37    ($id1:ident, $id2:ident) => {
38        $crate::model::identifiers::QualifiedIdentifier::from_str(&format!("{}:{}", $id1, $id2))
39            .unwrap()
40    };
41    ($id1:expr, $id2:expr) => {
42        $crate::model::identifiers::QualifiedIdentifier::from_str(&format!(
43            "{}:{}",
44            stringify!($id1),
45            stringify!($id2)
46        ))
47        .unwrap()
48    };
49    ($id:ident) => {
50        $crate::model::identifiers::Identifier::from_str(stringify!($id))
51    };
52    ($id:expr) => {
53        $crate::model::identifiers::Identifier::from_str($id)
54    };
55}
56
57#[macro_export]
58macro_rules! idref {
59    (unchecked $id1:ident : $id2:ident) => {
60        $crate::model::identifiers::QualifiedIdentifier::new_unchecked(
61            stringify!($id1),
62            stringify!($id2),
63        )
64        .into()
65    };
66    (unchecked $id1:expr, $id2:expr) => {
67        $crate::model::identifiers::QualifiedIdentifier::new_unchecked($id1, $id2).into()
68    };
69    (unchecked $id:ident) => {
70        $crate::model::identifiers::Identifier::new_unchecked(stringify!($id)).into()
71    };
72    (unchecked $id:expr) => {
73        $crate::model::identifiers::Identifier::new_unchecked($id).into()
74    };
75    ($id1:ident, $id2:ident) => {
76        $crate::model::identifiers::QualifiedIdentifier::from_str(&format!("{}:{}", $id1, $id2))
77            .unwrap()
78            .into()
79    };
80    ($id1:expr, $id2:expr) => {
81        $crate::model::identifiers::QualifiedIdentifier::from_str(&format!(
82            "{}:{}",
83            stringify!($id1),
84            stringify!($id2)
85        ))
86        .unwrap()
87        .into()
88    };
89}
90
91// ------------------------------------------------------------------------------------------------
92// Public Macros ❱  Values
93// ------------------------------------------------------------------------------------------------
94
95#[macro_export]
96macro_rules! lang {
97    ($name:ident) => {
98        $crate::model::values::LanguageTag::from_str(stringify!($name)).unwrap()
99    };
100    ($name:expr) => {
101        $crate::model::values::LanguageTag::from_str($name).unwrap()
102    };
103}
104
105#[macro_export]
106macro_rules! rdf_str {
107    ($name:ident @ $lang:ident) => {
108        $crate::model::values::LanguageString::new(stringify!($name), Some(lang!($lang)))
109    };
110    ($text:literal @ $lang:ident) => {
111        $crate::model::values::LanguageString::new($text, Some(lang!($lang)))
112    };
113    ($text:literal) => {
114        $crate::model::values::LanguageString::new($text, None)
115    };
116}
117
118#[macro_export]
119macro_rules! v {
120    ($value:literal) => {
121        $crate::model::values::SimpleValue::from($value)
122    };
123    ($key:literal => $value:literal) => {
124        $crate::model::values::MappingValue::new(SimpleValue::from($key), Value::from($value))
125    };
126    ($name:expr, $value:expr) => {
127        $crate::model::values::ValueConstructor::new(
128            $crate::model::identifiers::IdentifierReference::from($name),
129            $crate::model::values::SimpleValue::from($value),
130        )
131    };
132    ($name:expr) => {
133        $crate::model::identifiers::IdentifierReference::from($name)
134    };
135}
136
137#[macro_export]
138macro_rules! url {
139    ($value:literal) => {
140        url::Url::parse($value).unwrap()
141    };
142}
143
144#[macro_export]
145macro_rules! vs {
146    ($( $value:expr ),*) => {
147        vs!($( $value, )*)
148    };
149    ($( $value:expr, )*) => {
150        $crate::model::values::SequenceOfValues::from_iter([
151            $(
152                $crate::model::values::SequenceMember::from($value),
153            )*
154        ])
155    };
156}
157
158// ------------------------------------------------------------------------------------------------
159// Public Macros ❱  Cardinalities
160// ------------------------------------------------------------------------------------------------
161
162#[macro_export]
163macro_rules! range {
164    () => {
165        $crate::model::members::CardinalityRange::default()
166    };
167    ($only:literal) => {
168        $crate::model::members::CardinalityRange::new_single($only)
169    };
170    ($min:literal .. ) => {
171        $crate::model::members::CardinalityRange::new_unbounded($min)
172    };
173    ($min:literal .. $max:literal) => {
174        $crate::model::members::CardinalityRange::new_range($min, $max)
175    };
176}
177
178#[macro_export]
179macro_rules! cardinality {
180    (ordered) => {
181        $crate::model::members::Cardinality::new(
182            Some($crate::model::members::Ordering::Ordered),
183            None,
184            $crate::model::members::CardinalityRange::default(),
185        )
186    };
187    (ordered, $only:literal) => {
188        $crate::model::members::Cardinality::new(
189            Some($crate::model::members::Ordering::Ordered),
190            None,
191            $crate::model::members::CardinalityRange::new_single($only),
192        )
193    };
194    (ordered, $min:literal .. ) => {
195        $crate::model::members::Cardinality::new(
196            Some($crate::model::members::Ordering::Ordered),
197            None,
198            $crate::model::members::CardinalityRange::new_unbounded($min),
199        )
200    };
201    (ordered, $min:literal .. $max:literal) => {
202        $crate::model::members::Cardinality::new(
203            Some($crate::model::members::Ordering::Ordered),
204            None,
205            $crate::model::members::CardinalityRange::new_range($min, $max),
206        )
207    };
208    // ===============================================
209    (ordered, unique) => {
210        $crate::model::members::Cardinality::new(
211            Some($crate::model::members::Ordering::Ordered),
212            Some($crate::model::members::Uniqueness::Unique),
213            $crate::model::members::CardinalityRange::default(),
214        )
215    };
216    (ordered, unique, $only:literal) => {
217        $crate::model::members::Cardinality::new(
218            Some($crate::model::members::Ordering::Ordered),
219            Some($crate::model::members::Uniqueness::Unique),
220            $crate::model::members::CardinalityRange::new_single($only),
221        )
222    };
223    (ordered, unique, $min:literal .. ) => {
224        $crate::model::members::Cardinality::new(
225            Some($crate::model::members::Ordering::Ordered),
226            Some($crate::model::members::Uniqueness::Unique),
227            $crate::model::members::CardinalityRange::new_unbounded($min),
228        )
229    };
230    (ordered, unique, $min:literal .. $max:literal) => {
231        $crate::model::members::Cardinality::new(
232            Some($crate::model::members::Ordering::Ordered),
233            Some($crate::model::members::Uniqueness::Unique),
234            $crate::model::members::CardinalityRange::new_range($min, $max),
235        )
236    };
237    // ===============================================
238    (ordered, nonunique) => {
239        $crate::model::members::Cardinality::new(
240            Some($crate::model::members::Ordering::Ordered),
241            Some($crate::model::members::Uniqueness::NonUnique),
242            $crate::model::members::CardinalityRange::default(),
243        )
244    };
245    (ordered, nonunique, $only:literal) => {
246        $crate::model::members::Cardinality::new(
247            Some($crate::model::members::Ordering::Ordered),
248            Some($crate::model::members::Uniqueness::NonUnique),
249            $crate::model::members::ardinalityRange::new_single($only),
250        )
251    };
252    (ordered, nonunique, $min:literal .. ) => {
253        $crate::model::members::Cardinality::new(
254            Some($crate::model::members::Ordering::Ordered),
255            Some($crate::model::members::Uniqueness::NonUnique),
256            $crate::model::members::CardinalityRange::new_unbounded($min),
257        )
258    };
259    (ordered, nonunique, $min:literal .. $max:literal) => {
260        $crate::model::members::Cardinality::new(
261            Some($crate::model::members::Ordering::Ordered),
262            Some($crate::model::members::Uniqueness::NonUnique),
263            $crate::model::members::CardinalityRange::new_range($min, $max),
264        )
265    };
266    // ===============================================
267    // ===============================================
268    (unordered) => {
269        $crate::model::members::Cardinality::new(
270            Some($crate::model::members::Ordering::Unordered),
271            None,
272            $crate::model::members::CardinalityRange::default(),
273        )
274    };
275    (unordered, $only:literal) => {
276        $crate::model::members::Cardinality::new(
277            Some($crate::model::members::Ordering::Unordered),
278            None,
279            $crate::model::members::CardinalityRange::new_single($only),
280        )
281    };
282    (unordered, $min:literal .. ) => {
283        $crate::model::members::Cardinality::new(
284            Some($crate::model::members::Ordering::Unordered),
285            None,
286            $crate::model::members::CardinalityRange::new_unbounded($min),
287        )
288    };
289    (unordered, $min:literal .. $max:literal) => {
290        $crate::model::members::Cardinality::new(
291            Some($crate::model::members::Ordering::Unordered),
292            None,
293            $crate::model::members::CardinalityRange::new_range($min, $max),
294        )
295    };
296    // ===============================================
297    (unordered, unique) => {
298        $crate::model::members::Cardinality::new(
299            Some($crate::model::members::Ordering::Unordered),
300            Some($crate::model::members::Uniqueness::Unique),
301            C$crate::model::members::ardinalityRange::default(),
302        )
303    };
304    (unordered, unique, $only:literal) => {
305        $crate::model::members::Cardinality::new(
306            Some($crate::model::members::Ordering::Unordered),
307            Some($crate::model::members::Uniqueness::Unique),
308            CardinalityRange::new_single($only),
309        )
310    };
311    (unordered, unique, $min:literal .. ) => {
312        $crate::model::members::Cardinality::new(
313            Some($crate::model::members::Ordering::Unordered),
314            Some($crate::model::members::Uniqueness::Unique),
315            CardinalityRange::new_unbounded($min),
316        )
317    };
318    (unordered, unique, $min:literal .. $max:literal) => {
319        $crate::model::members::Cardinality::new(
320            Some($crate::model::members::Ordering::Unordered),
321            Some($crate::model::members::Uniqueness::Unique),
322            $crate::model::members::CardinalityRange::new_range($min, $max),
323        )
324    };
325    // ===============================================
326    (unordered, nonunique) => {
327        $crate::model::members::Cardinality::new(
328            Some($crate::model::members::Ordering::Unordered),
329            Some($crate::model::members::Uniqueness::NonUnique),
330            $crate::model::members::CardinalityRange::default(),
331        )
332    };
333    (unordered, nonunique, $only:literal) => {
334        $crate::model::members::Cardinality::new(
335            Some($crate::model::members::Ordering::Unordered),
336            Some($crate::model::members::Uniqueness::NonUnique),
337            $crate::model::members::CardinalityRange::new_single($only),
338        )
339    };
340    (unordered, nonunique, $min:literal .. ) => {
341        $crate::model::members::Cardinality::new(
342            Some($crate::model::members::Ordering::Unordered),
343            Some($crate::model::members::Uniqueness::NonUnique),
344            $crate::model::members::CardinalityRange::new_unbounded($min),
345        )
346    };
347    (unordered, nonunique, $min:literal .. $max:literal) => {
348        $crate::model::members::Cardinality::new(
349            Some($crate::model::members::Ordering::Unordered),
350            Some($crate::model::members::Uniqueness::NonUnique),
351            $crate::model::members::CardinalityRange::new_range($min, $max),
352        )
353    };
354    // ===============================================
355    // ===============================================
356    (unique) => {
357        $crate::model::members::Cardinality::new(
358            None,
359            Some($crate::model::members::Uniqueness::Unique),
360            $crate::model::members::CardinalityRange::default(),
361        )
362    };
363    (unique, $only:literal) => {
364        $crate::model::members::Cardinality::new(
365            None,
366            Some($crate::model::members::Uniqueness::Unique),
367            $crate::model::members::CardinalityRange::new_single($only),
368        )
369    };
370    (unique, $min:literal .. ) => {
371        $crate::model::members::Cardinality::new(
372            None,
373            Some($crate::model::members::Uniqueness::Unique),
374            $crate::model::members::CardinalityRange::new_unbounded($min),
375        )
376    };
377    (unique, $min:literal .. $max:literal) => {
378        $crate::model::members::Cardinality::new(
379            None,
380            Some($crate::model::members::Uniqueness::Unique),
381            $crate::model::members::CardinalityRange::new_range($min, $max),
382        )
383    };
384    // ===============================================
385    // ===============================================
386    (nonunique) => {
387        $crate::model::members::Cardinality::new(
388            None,
389            Some($crate::model::members::Uniqueness::NonUnique),
390            $crate::model::members::CardinalityRange::default(),
391        )
392    };
393    (nonunique, $only:literal) => {
394        $crate::model::members::Cardinality::new(
395            None,
396            Some($crate::model::members::Uniqueness::NonUnique),
397            $crate::model::members::CardinalityRange::new_single($only),
398        )
399    };
400    (nonunique, $min:literal .. ) => {
401        $crate::model::members::Cardinality::new(
402            None,
403            Some($crate::model::members::Uniqueness::NonUnique),
404            $crate::model::members::CardinalityRange::new_unbounded($min),
405        )
406    };
407    (nonunique, $min:literal .. $max:literal) => {
408        $crate::model::members::Cardinality::new(
409            None,
410            Some($crate::model::members::Uniqueness::NonUnique),
411            $crate::model::members::CardinalityRange::new_range($min, $max),
412        )
413    };
414    // ===============================================
415    // ===============================================
416    () => {
417        $crate::model::members::Cardinality::new(
418            None,
419            None,
420            $crate::model::members::CardinalityRange::default(),
421        )
422    };
423    ($only:literal) => {
424        $crate::model::members::Cardinality::new(
425            None,
426            None,
427            $crate::model::members::CardinalityRange::new_single($only),
428        )
429    };
430    ($min:literal .. ) => {
431        $crate::model::members::Cardinality::new(
432            None,
433            None,
434            $crate::model::members::CardinalityRange::new_unbounded($min),
435        )
436    };
437    ($min:literal .. $max:literal) => {
438        $crate::model::members::Cardinality::new(
439            None,
440            None,
441            $crate::model::members::CardinalityRange::new_range($min, $max),
442        )
443    };
444}
445
446// ------------------------------------------------------------------------------------------------
447// Public Macros ❱ Annotations
448// ------------------------------------------------------------------------------------------------
449
450#[macro_export]
451macro_rules! annotation {
452    ($name:expr, $value:literal) => {
453        $crate::model::annotations::AnnotationProperty::new($name, SimpleValue::from($value)).into()
454    };
455    ($name:expr, $value:expr) => {
456        $crate::model::annotations::AnnotationProperty::new($name, $value).into()
457    };
458    ($name:literal => $value:literal) => {
459        $crate::model::annotations::AnnotationProperty::new(id!(unchecked $name), SimpleValue::from($value)).into()
460    };
461    ($name:expr => $value:literal) => {
462        $crate::model::annotations::AnnotationProperty::new($name, SimpleValue::from($value)).into()
463    };
464    ($name:expr => $value:expr) => {
465        $crate::model::annotations::AnnotationProperty::new($name, $value).into()
466    };
467}
468
469#[macro_export]
470macro_rules! annotation_body {
471    ($( $annotation:expr, )*) => {
472        $crate::model::annotations::AnnotationOnlyBody::from(vec![
473            $(
474                $annotation,
475            )*
476        ])
477    };
478    ($( $annotation:expr ),*) => {
479        annotation_body!($( $annotation, )*)
480    };
481}
482
483// ------------------------------------------------------------------------------------------------
484// Public Macros ❱ Modules & Imports
485// ------------------------------------------------------------------------------------------------
486
487#[macro_export]
488macro_rules! module {
489    ($name:expr, $base_uri:expr ; call $body_fn:expr) => {{
490        let module = $crate::model::modules::Module::new($name).with_base_uri($base_uri);
491        let module = $body_fn(module);
492        module
493    }};
494}
495
496#[macro_export]
497macro_rules! import_statement {
498    ($( $import:expr ),*) => {
499        import_statement!($( $import, )*)
500    };
501    ($( $import:expr, )*) => {
502        $crate::model::modules::ImportStatement::from_iter([
503            $(
504                $crate::model::modules::Import::from($import),
505            )*
506        ])
507    };
508}
509
510// ------------------------------------------------------------------------------------------------
511// Public Macros ❱ Members & Variants
512// ------------------------------------------------------------------------------------------------
513
514#[macro_export]
515macro_rules! member {
516    ($name:expr => unknown) => {
517        $crate::model::members::MemberDef::new_unknown($name)
518    };
519    ($name:expr => $target:expr) => {
520        $crate::model::members::MemberDef::new(
521            $name,
522            $crate::model::members::TypeReference::from($target)
523        )
524    };
525    ($name:expr => $domain:expr => $range:expr) => {
526        member!($name => $crate::model::members::MappingType::new($domain, $range))
527    };
528    // ======================================
529    ($name:expr => { $card:expr } unknown) => {
530        $crate::model::members::MemberDef::new_unknown($name).with_target_cardinality($card)
531    };
532    ($name:expr => { $card:expr } $target:expr) => {
533        $crate::model::members::MemberDef::new(
534            $name,
535            $crate::model::members::TypeReference::from($target)
536        ).with_target_cardinality($card)
537    };
538    ($name:expr => { $card:expr } $domain:expr => $range:expr) => {
539        member!($name => { $card } $crate::model::members::MappingType::new($domain, $range))
540    };
541}
542
543#[macro_export]
544macro_rules! unvar {
545    ($type_name:expr) => {
546        $crate::model::definitions::TypeVariant::new(
547            $crate::model::identifiers::IdentifierReference::from($type_name),
548        )
549    };
550    ($type_name:expr ; $body:expr) => {
551        $crate::model::definitions::TypeVariant::new(
552            $crate::model::identifiers::IdentifierReference::from($type_name),
553        )
554        .with_body($body)
555    };
556    ($type_name:expr, $rename:expr) => {
557        $crate::model::definitions::TypeVariant::new(
558            $crate::model::identifiers::IdentifierReference::from($type_name),
559        )
560        .with_rename($rename)
561    };
562    ($type_name:expr, $rename:expr ; $body:expr) => {
563        $crate::model::definitions::TypeVariant::new(
564            $crate::model::identifiers::IdentifierReference::from($type_name),
565        )
566        .with_rename($rename)
567        .with_body($body)
568    };
569}
570
571// ------------------------------------------------------------------------------------------------
572// Public Macros ❱ Definitions ❱ Datatype
573// ------------------------------------------------------------------------------------------------
574
575#[macro_export]
576macro_rules! datatype {
577    ($name:expr, $base:expr ; call $body_fn:expr) => {
578        datatype!($name, $base ; $body_fn($crate::model::annotations::AnnotationOnlyBody::default()))
579    };
580    ($name:expr, $base:expr ; $body:expr) => {
581        datatype!($name, $base).with_body($body)
582    };
583    ($name:expr, $base:expr) => {
584        $crate::model::definitions::DatatypeDef::new($name, $base)
585    };
586}
587
588// ------------------------------------------------------------------------------------------------
589// Public Macros ❱ Definitions ❱ Property
590// ------------------------------------------------------------------------------------------------
591
592#[macro_export]
593macro_rules! property {
594    ($member_def:expr) => {
595        $crate::model::definitions::PropertyDef::from($member_def)
596    };
597    ($member_def:expr ; $body:expr) => {
598        property!($member_def.with_body($body))
599    };
600    // ======================================
601    ($name:expr => unknown) => {
602        property!(member!($name => unknown))
603    };
604    ($name:expr => unknown ; $body:expr) => {
605        property!(member!($name => unknown).with_body($body))
606    };
607    ($name:expr => $target:expr) => {
608        property!(member!($name => $target))
609    };
610    ($name:expr => $target:expr ; $body:expr) => {
611        property!(member!($name => $target).with_body($body))
612    };
613    ($name:expr => $domain:expr => $range:expr) => {
614        property!(member!($name => $domain => $range))
615    };
616    ($name:expr => $domain:expr => $range:expr ; $body:expr) => {
617        property!(member!($name => $domain => $range).with_body($body))
618    };
619    // ======================================
620    ($name:expr => { $card:expr } unknown) => {
621        property!(member!($name => { $card } unknown))
622    };
623    ($name:expr => { $card:expr } unknown ; $body:expr) => {
624        property!(member!($name => { $card } unknown).with_body($body))
625    };
626    ($name:expr => { $card:expr } $target:expr) => {
627        property!(member!($name => { $card } $target))
628    };
629    ($name:expr => { $card:expr } $target:expr ; $body:expr) => {
630        property!(member!($name => { $card } $target).with_body($body))
631    };
632    ($name:expr => { $card:expr } $domain:expr => $range:expr) => {
633        property!(member!($name => { $card } $domain => $range))
634    };
635    ($name:expr => { $card:expr } $domain:expr => $range:expr ; $body:expr) => {
636        property!(member!($name => { $card } $domain => $range).with_body($body))
637    };
638}
639
640// ------------------------------------------------------------------------------------------------
641// Public Macros ❱ Definitionss ❱ RDF
642// ------------------------------------------------------------------------------------------------
643
644#[macro_export]
645macro_rules! rdf {
646    ($name:expr ; class $( $super:expr ),* ; call $body_fn:expr) => {{
647        let mut body = $crate::model::annotations::AnnotationOnlyBody::default();
648        body.extend_annotations([
649            annotation!(id!(unchecked rdf:type), id!(unchecked rdfs:Resource)),
650            annotation!(id!(unchecked rdf:type), id!(unchecked rdfs:Class)),
651            $(
652                annotation!(id!(unchecked rdfs:subClassOf), $super),
653            )*
654        ]);
655        rdf!($name ; $body_fn(body))
656    }};
657    ($name:expr ; property $( $super:expr ),* ; call $body_fn:expr) => {{
658        let mut body = $crate::model::annotations::AnnotationOnlyBody::default();
659        body.extend_annotations([
660            annotation!(id!(unchecked rdf:type), id!(unchecked rdf:Property)),
661            $(
662                annotation!(id!(unchecked rdfs:subPropertyOf), $super),
663            )*
664        ]);
665        rdf!($name ; $body_fn(body))
666    }};
667    ($name:expr ; individual $( $type:expr ),* ; call $body_fn:expr) => {{
668        let mut body = $crate::model::annotations::AnnotationOnlyBody::default();
669        body.extend_annotations([
670            annotation!(id!(unchecked rdf:type), id!(unchecked owl:NamedIndividual)),
671            $(
672                annotation!(id!(unchecked rdf:type), $type),
673            )*
674        ]);
675        rdf!($name ; $body_fn(body))
676    }};
677    ($name:expr ; unnamed individual $( $type:expr ),* ; call $body_fn:expr) => {{
678        let mut body = $crate::model::annotations::AnnotationOnlyBody::default();
679        body.extend_annotations([
680            $(
681                annotation!(id!(unchecked rdf:type), $type),
682            )*
683        ]);
684        rdf!($name ; $body_fn(body))
685    }};
686    ($name:expr ; datatype ; call $body_fn:expr) => {{
687        let mut body = $crate::model::annotations::AnnotationOnlyBody::default();
688        body.extend_annotations([
689            annotation!(id!(unchecked rdf:type), id!(unchecked rdfs:Resource)),
690            annotation!(id!(unchecked rdf:type), id!(unchecked rdfs:Datatype)),
691        ]);
692        rdf!($name ; $body_fn(body))
693    }};
694    ($name:expr ; call $body_fn:expr) => {
695        rdf!($name ; $body_fn($crate::model::annotations::AnnotationOnlyBody::default()))
696    };
697    ($name:expr ; $body:expr) => {
698        rdf!($name).with_body($body)
699    };
700    ($name:expr) => {
701        $crate::model::definitions::RdfDef::new($name)
702    };
703}
704
705// ------------------------------------------------------------------------------------------------
706// Public Macros ❱ Definitions ❱ Structure
707// ------------------------------------------------------------------------------------------------
708
709#[macro_export]
710macro_rules! structure {
711    ($name:expr ; call $body_fn:expr) => {
712        structure!($name ; $body_fn($crate::model::definitions::StructureBody::default()))
713    };
714    ($name:expr ; $body:expr) => {
715        structure!($name).with_body($body)
716    };
717    ($name:expr) => {
718        $crate::model::definitions::StructureDef::new($name)
719    };
720}
721
722// ------------------------------------------------------------------------------------------------
723// Public Macros ❱ Definitions ❱ Union
724// ------------------------------------------------------------------------------------------------
725
726#[macro_export]
727macro_rules! union {
728    ($name:expr ; call $body_fn:expr) => {
729        union!($name ; $body_fn($crate::model::definitions::UnionBody::default()))
730    };
731    ($name:expr ; $body:expr) => {
732        union!($name).with_body($body)
733    };
734    ($name:expr) => {
735        $crate::model::definitions::UnionDef::new($name)
736    };
737}
738
739// ------------------------------------------------------------------------------------------------
740// Public Macros ❱ Modules
741// ------------------------------------------------------------------------------------------------
742
743#[macro_export]
744macro_rules! module_function {
745    ($init_fn:expr) => {
746        static __MODULE: ::std::sync::OnceLock<$crate::model::modules::Module> =
747            ::std::sync::OnceLock::new();
748
749        pub fn module() -> &'static Module {
750            __MODULE.get_or_init($init_fn)
751        }
752    };
753}