Skip to main content

rh_codegen/
macros.rs

1//! Macros for generating primitive FHIR fields with extension companions
2//!
3//! These macros generate both the primitive type field and its corresponding
4//! extension field for FHIR primitives.
5
6/// Generate a string field with optional extension companion
7///
8/// # Usage
9/// ```ignore
10/// // Within a struct definition:
11/// primitive_string!("description", true);  // Optional field
12/// primitive_string!("name", false);        // Required field
13/// ```
14///
15/// # Generated Code
16/// For `primitive_string!("description", true)`:
17/// ```ignore
18/// /// Field: description
19/// pub description: Option<StringType>,
20/// /// Extension element for the 'description' primitive field. Contains metadata and extensions.
21/// pub _description: Option<Element>,
22/// ```
23#[macro_export]
24macro_rules! primitive_string {
25    ($field_name:literal, true) => {
26        paste::paste! {
27            #[doc = concat!("Field: ", $field_name)]
28            pub [<$field_name>]: Option<$crate::primitives::StringType>,
29            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
30            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
31        }
32    };
33    ($field_name:literal, false) => {
34        paste::paste! {
35            #[doc = concat!("Field: ", $field_name)]
36            pub [<$field_name>]: $crate::primitives::StringType,
37            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
38            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
39        }
40    };
41}
42
43/// Generate a boolean field with optional extension companion
44#[macro_export]
45macro_rules! primitive_boolean {
46    ($field_name:literal, true) => {
47        paste::paste! {
48            #[doc = concat!("Field: ", $field_name)]
49            pub [<$field_name>]: Option<$crate::primitives::BooleanType>,
50            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
51            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
52        }
53    };
54    ($field_name:literal, false) => {
55        paste::paste! {
56            #[doc = concat!("Field: ", $field_name)]
57            pub [<$field_name>]: $crate::primitives::BooleanType,
58            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
59            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
60        }
61    };
62}
63
64/// Generate an integer field with optional extension companion
65#[macro_export]
66macro_rules! primitive_integer {
67    ($field_name:literal, true) => {
68        paste::paste! {
69            #[doc = concat!("Field: ", $field_name)]
70            pub [<$field_name>]: Option<$crate::primitives::IntegerType>,
71            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
72            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
73        }
74    };
75    ($field_name:literal, false) => {
76        paste::paste! {
77            #[doc = concat!("Field: ", $field_name)]
78            pub [<$field_name>]: $crate::primitives::IntegerType,
79            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
80            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
81        }
82    };
83}
84
85/// Generate a decimal field with optional extension companion
86#[macro_export]
87macro_rules! primitive_decimal {
88    ($field_name:literal, true) => {
89        paste::paste! {
90            #[doc = concat!("Field: ", $field_name)]
91            pub [<$field_name>]: Option<$crate::primitives::DecimalType>,
92            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
93            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
94        }
95    };
96    ($field_name:literal, false) => {
97        paste::paste! {
98            #[doc = concat!("Field: ", $field_name)]
99            pub [<$field_name>]: $crate::primitives::DecimalType,
100            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
101            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
102        }
103    };
104}
105
106/// Generate a dateTime field with optional extension companion
107#[macro_export]
108macro_rules! primitive_datetime {
109    ($field_name:literal, true) => {
110        paste::paste! {
111            #[doc = concat!("Field: ", $field_name)]
112            pub [<$field_name>]: Option<$crate::primitives::DateTimeType>,
113            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
114            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
115        }
116    };
117    ($field_name:literal, false) => {
118        paste::paste! {
119            #[doc = concat!("Field: ", $field_name)]
120            pub [<$field_name>]: $crate::primitives::DateTimeType,
121            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
122            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
123        }
124    };
125}
126
127/// Generate a date field with optional extension companion
128#[macro_export]
129macro_rules! primitive_date {
130    ($field_name:literal, true) => {
131        paste::paste! {
132            #[doc = concat!("Field: ", $field_name)]
133            pub [<$field_name>]: Option<$crate::primitives::DateType>,
134            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
135            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
136        }
137    };
138    ($field_name:literal, false) => {
139        paste::paste! {
140            #[doc = concat!("Field: ", $field_name)]
141            pub [<$field_name>]: $crate::primitives::DateType,
142            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
143            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
144        }
145    };
146}
147
148/// Generate a time field with optional extension companion
149#[macro_export]
150macro_rules! primitive_time {
151    ($field_name:literal, true) => {
152        paste::paste! {
153            #[doc = concat!("Field: ", $field_name)]
154            pub [<$field_name>]: Option<$crate::primitives::TimeType>,
155            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
156            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
157        }
158    };
159    ($field_name:literal, false) => {
160        paste::paste! {
161            #[doc = concat!("Field: ", $field_name)]
162            pub [<$field_name>]: $crate::primitives::TimeType,
163            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
164            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
165        }
166    };
167}
168
169/// Generate a uri field with optional extension companion
170#[macro_export]
171macro_rules! primitive_uri {
172    ($field_name:literal, true) => {
173        paste::paste! {
174            #[doc = concat!("Field: ", $field_name)]
175            pub [<$field_name>]: Option<$crate::primitives::UriType>,
176            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
177            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
178        }
179    };
180    ($field_name:literal, false) => {
181        paste::paste! {
182            #[doc = concat!("Field: ", $field_name)]
183            pub [<$field_name>]: $crate::primitives::UriType,
184            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
185            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
186        }
187    };
188}
189
190/// Generate a canonical field with optional extension companion
191#[macro_export]
192macro_rules! primitive_canonical {
193    ($field_name:literal, true) => {
194        paste::paste! {
195            #[doc = concat!("Field: ", $field_name)]
196            pub [<$field_name>]: Option<$crate::primitives::CanonicalType>,
197            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
198            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
199        }
200    };
201    ($field_name:literal, false) => {
202        paste::paste! {
203            #[doc = concat!("Field: ", $field_name)]
204            pub [<$field_name>]: $crate::primitives::CanonicalType,
205            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
206            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
207        }
208    };
209}
210
211/// Generate a base64Binary field with optional extension companion
212#[macro_export]
213macro_rules! primitive_base64binary {
214    ($field_name:literal, true) => {
215        paste::paste! {
216            #[doc = concat!("Field: ", $field_name)]
217            pub [<$field_name>]: Option<$crate::primitives::Base64BinaryType>,
218            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
219            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
220        }
221    };
222    ($field_name:literal, false) => {
223        paste::paste! {
224            #[doc = concat!("Field: ", $field_name)]
225            pub [<$field_name>]: $crate::primitives::Base64BinaryType,
226            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
227            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
228        }
229    };
230}
231
232/// Generate an instant field with optional extension companion
233#[macro_export]
234macro_rules! primitive_instant {
235    ($field_name:literal, true) => {
236        paste::paste! {
237            #[doc = concat!("Field: ", $field_name)]
238            pub [<$field_name>]: Option<$crate::primitives::InstantType>,
239            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
240            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
241        }
242    };
243    ($field_name:literal, false) => {
244        paste::paste! {
245            #[doc = concat!("Field: ", $field_name)]
246            pub [<$field_name>]: $crate::primitives::InstantType,
247            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
248            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
249        }
250    };
251}
252
253/// Generate a positiveInt field with optional extension companion
254#[macro_export]
255macro_rules! primitive_positiveint {
256    ($field_name:literal, true) => {
257        paste::paste! {
258            #[doc = concat!("Field: ", $field_name)]
259            pub [<$field_name>]: Option<$crate::primitives::positiveint::PositiveIntType>,
260            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
261            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
262        }
263    };
264    ($field_name:literal, false) => {
265        paste::paste! {
266            #[doc = concat!("Field: ", $field_name)]
267            pub [<$field_name>]: $crate::primitives::positiveint::PositiveIntType,
268            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
269            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
270        }
271    };
272}
273
274/// Generate an unsignedInt field with optional extension companion
275#[macro_export]
276macro_rules! primitive_unsignedint {
277    ($field_name:literal, true) => {
278        paste::paste! {
279            #[doc = concat!("Field: ", $field_name)]
280            pub [<$field_name>]: Option<$crate::primitives::unsignedint::UnsignedIntType>,
281            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
282            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
283        }
284    };
285    ($field_name:literal, false) => {
286        paste::paste! {
287            #[doc = concat!("Field: ", $field_name)]
288            pub [<$field_name>]: $crate::primitives::unsignedint::UnsignedIntType,
289            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
290            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
291        }
292    };
293}
294
295/// Generate an id field with optional extension companion
296#[macro_export]
297macro_rules! primitive_id {
298    ($field_name:literal, true) => {
299        paste::paste! {
300            #[doc = concat!("Field: ", $field_name)]
301            pub [<$field_name>]: Option<$crate::primitives::IdType>,
302            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
303            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
304        }
305    };
306    ($field_name:literal, false) => {
307        paste::paste! {
308            #[doc = concat!("Field: ", $field_name)]
309            pub [<$field_name>]: $crate::primitives::IdType,
310            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
311            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
312        }
313    };
314}
315
316/// Generate an oid field with optional extension companion
317#[macro_export]
318macro_rules! primitive_oid {
319    ($field_name:literal, true) => {
320        paste::paste! {
321            #[doc = concat!("Field: ", $field_name)]
322            pub [<$field_name>]: Option<$crate::primitives::OidType>,
323            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
324            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
325        }
326    };
327    ($field_name:literal, false) => {
328        paste::paste! {
329            #[doc = concat!("Field: ", $field_name)]
330            pub [<$field_name>]: $crate::primitives::OidType,
331            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
332            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
333        }
334    };
335}
336
337/// Generate a uuid field with optional extension companion
338#[macro_export]
339macro_rules! primitive_uuid {
340    ($field_name:literal, true) => {
341        paste::paste! {
342            #[doc = concat!("Field: ", $field_name)]
343            pub [<$field_name>]: Option<$crate::primitives::UuidType>,
344            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
345            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
346        }
347    };
348    ($field_name:literal, false) => {
349        paste::paste! {
350            #[doc = concat!("Field: ", $field_name)]
351            pub [<$field_name>]: $crate::primitives::UuidType,
352            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
353            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
354        }
355    };
356}
357
358/// Generate a code field with optional extension companion
359#[macro_export]
360macro_rules! primitive_code {
361    ($field_name:literal, true) => {
362        paste::paste! {
363            #[doc = concat!("Field: ", $field_name)]
364            pub [<$field_name>]: Option<$crate::primitives::CodeType>,
365            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
366            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
367        }
368    };
369    ($field_name:literal, false) => {
370        paste::paste! {
371            #[doc = concat!("Field: ", $field_name)]
372            pub [<$field_name>]: $crate::primitives::CodeType,
373            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
374            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
375        }
376    };
377}
378
379/// Generate a markdown field with optional extension companion
380#[macro_export]
381macro_rules! primitive_markdown {
382    ($field_name:literal, true) => {
383        paste::paste! {
384            #[doc = concat!("Field: ", $field_name)]
385            pub [<$field_name>]: Option<$crate::primitives::MarkdownType>,
386            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
387            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
388        }
389    };
390    ($field_name:literal, false) => {
391        paste::paste! {
392            #[doc = concat!("Field: ", $field_name)]
393            pub [<$field_name>]: $crate::primitives::MarkdownType,
394            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
395            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
396        }
397    };
398}
399
400/// Generate an url field with optional extension companion
401#[macro_export]
402macro_rules! primitive_url {
403    ($field_name:literal, true) => {
404        paste::paste! {
405            #[doc = concat!("Field: ", $field_name)]
406            pub [<$field_name>]: Option<$crate::primitives::UrlType>,
407            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
408            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
409        }
410    };
411    ($field_name:literal, false) => {
412        paste::paste! {
413            #[doc = concat!("Field: ", $field_name)]
414            pub [<$field_name>]: $crate::primitives::UrlType,
415            #[doc = concat!("Extension element for the '", $field_name, "' primitive field. Contains metadata and extensions.")]
416            pub [<_ $field_name>]: Option<$crate::datatypes::element::Element>,
417        }
418    };
419}