Skip to main content

haste_x_fhir_query/
conversion.rs

1use haste_fhir_model::r4::generated::{
2    terminology::IssueType,
3    types::{
4        FHIRBase64Binary, FHIRBoolean, FHIRCanonical, FHIRDate, FHIRDateTime, FHIRId, FHIRInstant,
5        FHIRInteger, FHIRMarkdown, FHIROid, FHIRPositiveInt, FHIRString, FHIRTime, FHIRUnsignedInt,
6        FHIRUri, FHIRUrl, FHIRUuid,
7    },
8};
9use haste_fhir_operation_error::OperationOutcomeError;
10use haste_reflect::MetaValue;
11
12fn downcast_meta_value<'a, T: 'static>(value: &'a dyn MetaValue) -> Option<&'a T> {
13    value.as_any().downcast_ref::<T>()
14}
15
16pub fn stringify_meta_value(value: &dyn MetaValue) -> Result<String, OperationOutcomeError> {
17    match value.typename() {
18        "http://hl7.org/fhirpath/System.String" => downcast_meta_value::<String>(value)
19            .map(|s| s.to_string())
20            .ok_or_else(|| {
21                OperationOutcomeError::fatal(
22                    IssueType::Invalid(None),
23                    "http://hl7.org/fhirpath/System.String value is missing.".to_string(),
24                )
25            }),
26        "FHIRBase64Binary" => downcast_meta_value::<FHIRBase64Binary>(value)
27            .and_then(|s| s.value.as_ref())
28            .map(|s| s.to_string())
29            .ok_or_else(|| {
30                OperationOutcomeError::fatal(
31                    IssueType::Invalid(None),
32                    "FHIRBase64Binary value is missing.".to_string(),
33                )
34            }),
35        "FHIRDecimal" => {
36            downcast_meta_value::<haste_fhir_model::r4::generated::types::FHIRDecimal>(value)
37                .and_then(|d| d.value.as_ref())
38                .map(|s| s.to_string())
39                .ok_or_else(|| {
40                    OperationOutcomeError::fatal(
41                        IssueType::Invalid(None),
42                        "FHIRDecimal value is missing.".to_string(),
43                    )
44                })
45        }
46
47        "FHIRBoolean" => downcast_meta_value::<FHIRBoolean>(value)
48            .and_then(|b| b.value)
49            .map(|b| b.to_string())
50            .ok_or_else(|| {
51                OperationOutcomeError::fatal(
52                    IssueType::Invalid(None),
53                    "FHIRBoolean value is missing.".to_string(),
54                )
55            }),
56
57        "FHIRUrl" => downcast_meta_value::<FHIRUrl>(value)
58            .and_then(|u| u.value.as_ref())
59            .map(|s| s.to_string())
60            .ok_or_else(|| {
61                OperationOutcomeError::fatal(
62                    IssueType::Invalid(None),
63                    "FHIRUrl value is missing.".to_string(),
64                )
65            }),
66
67        "FHIRCode" => {
68            downcast_meta_value::<haste_fhir_model::r4::generated::types::FHIRCode>(value)
69                .and_then(|c| c.value.as_ref())
70                .map(|s| s.to_string())
71                .ok_or_else(|| {
72                    OperationOutcomeError::fatal(
73                        IssueType::Invalid(None),
74                        "FHIRCode value is missing.".to_string(),
75                    )
76                })
77        }
78
79        "FHIRString" => downcast_meta_value::<FHIRString>(value)
80            .and_then(|s| s.value.as_ref())
81            .map(|s| s.to_string())
82            .ok_or_else(|| {
83                OperationOutcomeError::fatal(
84                    IssueType::Invalid(None),
85                    "FHIRString value is missing.".to_string(),
86                )
87            }),
88
89        "FHIRInteger" => downcast_meta_value::<FHIRInteger>(value)
90            .and_then(|i| i.value)
91            .map(|i| i.to_string())
92            .ok_or_else(|| {
93                OperationOutcomeError::fatal(
94                    IssueType::Invalid(None),
95                    "FHIRInteger value is missing.".to_string(),
96                )
97            }),
98
99        "FHIRUri" => downcast_meta_value::<FHIRUri>(value)
100            .and_then(|u| u.value.as_ref())
101            .map(|s| s.to_string())
102            .ok_or_else(|| {
103                OperationOutcomeError::fatal(
104                    IssueType::Invalid(None),
105                    "FHIRUri value is missing.".to_string(),
106                )
107            }),
108
109        "FHIRCanonical" => downcast_meta_value::<FHIRCanonical>(value)
110            .and_then(|c| c.value.as_ref())
111            .map(|s| s.to_string())
112            .ok_or_else(|| {
113                OperationOutcomeError::fatal(
114                    IssueType::Invalid(None),
115                    "FHIRCanonical value is missing.".to_string(),
116                )
117            }),
118
119        "FHIRMarkdown" => downcast_meta_value::<FHIRMarkdown>(value)
120            .and_then(|m| m.value.as_ref())
121            .map(|s| s.to_string())
122            .ok_or_else(|| {
123                OperationOutcomeError::fatal(
124                    IssueType::Invalid(None),
125                    "FHIRMarkdown value is missing.".to_string(),
126                )
127            }),
128
129        "FHIRId" => downcast_meta_value::<FHIRId>(value)
130            .and_then(|id| id.value.as_ref())
131            .map(|s| s.to_string())
132            .ok_or_else(|| {
133                OperationOutcomeError::fatal(
134                    IssueType::Invalid(None),
135                    "FHIRId value is missing.".to_string(),
136                )
137            }),
138
139        "FHIROid" => downcast_meta_value::<FHIROid>(value)
140            .and_then(|o| o.value.as_ref())
141            .map(|s| s.to_string())
142            .ok_or_else(|| {
143                OperationOutcomeError::fatal(
144                    IssueType::Invalid(None),
145                    "FHIROid value is missing.".to_string(),
146                )
147            }),
148
149        "FHIRUuid" => downcast_meta_value::<FHIRUuid>(value)
150            .and_then(|u| u.value.as_ref())
151            .map(|s| s.to_string())
152            .ok_or_else(|| {
153                OperationOutcomeError::fatal(
154                    IssueType::Invalid(None),
155                    "FHIRUuid value is missing.".to_string(),
156                )
157            }),
158
159        "FHIRUnsignedInt" => downcast_meta_value::<FHIRUnsignedInt>(value)
160            .and_then(|i| i.value)
161            .map(|i| i.to_string())
162            .ok_or_else(|| {
163                OperationOutcomeError::fatal(
164                    IssueType::Invalid(None),
165                    "FHIRUnsignedInt value is missing.".to_string(),
166                )
167            }),
168        "FHIRPositiveInt" => downcast_meta_value::<FHIRPositiveInt>(value)
169            .and_then(|i| i.value)
170            .map(|i| i.to_string())
171            .ok_or_else(|| {
172                OperationOutcomeError::fatal(
173                    IssueType::Invalid(None),
174                    "FHIRPositiveInt value is missing.".to_string(),
175                )
176            }),
177
178        "FHIRInstant" => downcast_meta_value::<FHIRInstant>(value)
179            .and_then(|dt| dt.value.as_ref())
180            .map(|s| s.to_string())
181            .ok_or_else(|| {
182                OperationOutcomeError::fatal(
183                    IssueType::Invalid(None),
184                    "FHIRInstant value is missing.".to_string(),
185                )
186            }),
187        "FHIRDate" => downcast_meta_value::<FHIRDate>(value)
188            .and_then(|dt| dt.value.as_ref())
189            .map(|s| s.to_string())
190            .ok_or_else(|| {
191                OperationOutcomeError::fatal(
192                    IssueType::Invalid(None),
193                    "FHIRDate value is missing.".to_string(),
194                )
195            }),
196        "FHIRTime" => downcast_meta_value::<FHIRTime>(value)
197            .and_then(|t| t.value.as_ref())
198            .map(|s| s.to_string())
199            .ok_or_else(|| {
200                OperationOutcomeError::fatal(
201                    IssueType::Invalid(None),
202                    "FHIRTime value is missing.".to_string(),
203                )
204            }),
205        "FHIRDateTime" => downcast_meta_value::<FHIRDateTime>(value)
206            .and_then(|dt| dt.value.as_ref())
207            .map(|s| s.to_string())
208            .ok_or_else(|| {
209                OperationOutcomeError::fatal(
210                    IssueType::Invalid(None),
211                    "FHIRDateTime value is missing.".to_string(),
212                )
213            }),
214
215        typename => Err(OperationOutcomeError::fatal(
216            IssueType::Invalid(None),
217            format!(
218                "Unsupported MetaValue type for stringification: '{}'",
219                typename
220            ),
221        )),
222    }
223}