haste_x_fhir_query/
conversion.rs1use 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}