1macro_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#[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#[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#[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 (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 (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 (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 (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 (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 (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 (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 () => {
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#[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#[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#[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 ($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#[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#[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 ($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 ($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#[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#[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#[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#[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}