1use derivative::Derivative;
2use haste_fhir_model::r4::generated::resources::{
3 Bundle, CapabilityStatement, Parameters, Resource, ResourceType,
4};
5use haste_jwt::VersionId;
6use json_patch::Patch;
7use thiserror::Error;
8
9use crate::url::ParsedParameters;
10
11#[derive(Derivative, Clone)]
12#[derivative(Debug)]
13pub struct FHIRCreateRequest {
14 pub resource_type: ResourceType,
15 #[derivative(Debug(format_with = "crate::redact"))]
16 pub resource: Resource,
17}
18
19#[derive(Derivative, Clone)]
20#[derivative(Debug)]
21pub struct FHIRReadRequest {
22 pub resource_type: ResourceType,
23 #[derivative(Debug(format_with = "crate::redact"))]
24 pub id: String,
25}
26
27#[derive(Derivative, Clone)]
28#[derivative(Debug)]
29pub struct FHIRVersionReadRequest {
30 pub resource_type: ResourceType,
31 #[derivative(Debug(format_with = "crate::redact"))]
32 pub id: String,
33 #[derivative(Debug(format_with = "crate::redact"))]
34 pub version_id: VersionId,
35}
36
37#[derive(Derivative, Clone)]
38#[derivative(Debug)]
39pub struct FHIRUpdateInstanceRequest {
40 pub resource_type: ResourceType,
41 #[derivative(Debug(format_with = "crate::redact"))]
42 pub id: String,
43 #[derivative(Debug(format_with = "crate::redact"))]
44 pub resource: Resource,
45}
46
47#[derive(Derivative, Clone)]
48#[derivative(Debug)]
49pub struct FHIRConditionalUpdateRequest {
50 pub resource_type: ResourceType,
51 pub parameters: ParsedParameters,
52 #[derivative(Debug(format_with = "crate::redact"))]
53 pub resource: Resource,
54}
55
56#[derive(Derivative, Clone)]
57#[derivative(Debug)]
58pub struct FHIRPatchRequest {
59 pub resource_type: ResourceType,
60 #[derivative(Debug(format_with = "crate::redact"))]
61 pub id: String,
62 #[derivative(Debug(format_with = "crate::redact"))]
63 pub patch: Patch,
64}
65
66#[derive(Derivative, Clone)]
67#[derivative(Debug)]
68pub struct FHIRHistoryInstanceRequest {
69 pub resource_type: ResourceType,
70 #[derivative(Debug(format_with = "crate::redact"))]
71 pub id: String,
72 pub parameters: ParsedParameters,
73}
74
75#[derive(Derivative, Clone)]
76#[derivative(Debug)]
77pub struct FHIRHistoryTypeRequest {
78 pub resource_type: ResourceType,
79 pub parameters: ParsedParameters,
80}
81
82#[derive(Derivative, Clone)]
83#[derivative(Debug)]
84pub struct FHIRHistorySystemRequest {
85 pub parameters: ParsedParameters,
86}
87
88#[derive(Derivative, Clone)]
89#[derivative(Debug)]
90pub struct FHIRDeleteInstanceRequest {
91 pub resource_type: ResourceType,
92 #[derivative(Debug(format_with = "crate::redact"))]
93 pub id: String,
94}
95
96#[derive(Derivative, Clone)]
97#[derivative(Debug)]
98pub struct FHIRDeleteTypeRequest {
99 pub resource_type: ResourceType,
100 pub parameters: ParsedParameters,
101}
102
103#[derive(Derivative, Clone)]
104#[derivative(Debug)]
105pub struct FHIRDeleteSystemRequest {
106 pub parameters: ParsedParameters,
107}
108
109#[derive(Derivative, Clone)]
110#[derivative(Debug)]
111pub struct FHIRSearchTypeRequest {
112 pub resource_type: ResourceType,
113 pub parameters: ParsedParameters,
114}
115
116#[derive(Derivative, Clone)]
117#[derivative(Debug)]
118pub struct FHIRSearchSystemRequest {
119 pub parameters: ParsedParameters,
120}
121
122#[derive(Error, Debug)]
123pub enum OperationParseError {
124 #[error("Invalid operation name")]
125 Invalid,
126}
127
128#[derive(Derivative, Clone)]
129#[derivative(Debug)]
130pub struct Operation(String);
131impl Operation {
132 #[must_use]
133 pub fn new(name: &str) -> Self {
134 let operation_name = name.trim_start_matches('$');
135 Operation(operation_name.to_string())
136 }
137 #[must_use]
138 pub fn name(&self) -> &str {
139 &self.0
140 }
141}
142
143#[derive(Derivative, Clone)]
144#[derivative(Debug)]
145pub struct FHIRInvokeInstanceRequest {
146 pub operation: Operation,
147 pub resource_type: ResourceType,
148 #[derivative(Debug(format_with = "crate::redact"))]
149 pub id: String,
150 #[derivative(Debug(format_with = "crate::redact"))]
151 pub parameters: Parameters,
152}
153
154#[derive(Derivative, Clone)]
155#[derivative(Debug)]
156pub struct FHIRInvokeTypeRequest {
157 pub operation: Operation,
158 pub resource_type: ResourceType,
159 #[derivative(Debug(format_with = "crate::redact"))]
160 pub parameters: Parameters,
161}
162
163#[derive(Derivative, Clone)]
164#[derivative(Debug)]
165pub struct FHIRInvokeSystemRequest {
166 pub operation: Operation,
167 #[derivative(Debug(format_with = "crate::redact"))]
168 pub parameters: Parameters,
169}
170
171#[derive(Derivative, Clone)]
172#[derivative(Debug)]
173pub struct FHIRBatchRequest {
174 #[derivative(Debug(format_with = "crate::redact"))]
175 pub resource: Bundle,
176}
177
178#[derive(Derivative, Clone)]
179#[derivative(Debug)]
180pub struct FHIRTransactionRequest {
181 #[derivative(Debug(format_with = "crate::redact"))]
182 pub resource: Bundle,
183}
184
185#[derive(Derivative, Clone)]
186#[derivative(Debug = "transparent")]
187pub enum InvocationRequest {
188 #[derivative(Debug = "transparent")]
189 Instance(FHIRInvokeInstanceRequest),
190 #[derivative(Debug = "transparent")]
191 Type(FHIRInvokeTypeRequest),
192 #[derivative(Debug = "transparent")]
193 System(FHIRInvokeSystemRequest),
194}
195
196#[derive(Derivative, Clone)]
197#[derivative(Debug = "transparent")]
198pub enum HistoryRequest {
199 #[derivative(Debug = "transparent")]
200 Instance(FHIRHistoryInstanceRequest),
201 #[derivative(Debug = "transparent")]
202 Type(FHIRHistoryTypeRequest),
203 #[derivative(Debug = "transparent")]
204 System(FHIRHistorySystemRequest),
205}
206
207#[derive(Derivative, Clone)]
208#[derivative(Debug = "transparent")]
209pub enum SearchRequest {
210 #[derivative(Debug = "transparent")]
211 Type(FHIRSearchTypeRequest),
212 #[derivative(Debug = "transparent")]
213 System(FHIRSearchSystemRequest),
214}
215
216#[derive(Derivative, Clone)]
217#[derivative(Debug = "transparent")]
218pub enum DeleteRequest {
219 #[derivative(Debug = "transparent")]
220 Instance(FHIRDeleteInstanceRequest),
221 #[derivative(Debug = "transparent")]
222 Type(FHIRDeleteTypeRequest),
223 #[derivative(Debug = "transparent")]
224 System(FHIRDeleteSystemRequest),
225}
226
227#[derive(Derivative, Clone)]
228#[derivative(Debug = "transparent")]
229pub enum UpdateRequest {
230 #[derivative(Debug = "transparent")]
231 Instance(FHIRUpdateInstanceRequest),
232 #[derivative(Debug = "transparent")]
233 Conditional(FHIRConditionalUpdateRequest),
234}
235
236#[derive(Derivative, Clone)]
237#[derivative(Debug)]
238pub struct CompartmentRequest {
239 pub resource_type: ResourceType,
240 #[derivative(Debug(format_with = "crate::redact"))]
241 pub id: String,
242 pub request: Box<FHIRRequest>,
243}
244
245#[derive(Derivative, Clone)]
246#[derivative(Debug = "transparent")]
247pub enum FHIRRequest {
248 #[derivative(Debug = "transparent")]
249 Create(FHIRCreateRequest),
250 #[derivative(Debug = "transparent")]
251 Read(FHIRReadRequest),
252 #[derivative(Debug = "transparent")]
253 VersionRead(FHIRVersionReadRequest),
254 #[derivative(Debug = "transparent")]
255 Update(UpdateRequest),
256 #[derivative(Debug = "transparent")]
257 Patch(FHIRPatchRequest),
258 #[derivative(Debug = "transparent")]
259 Delete(DeleteRequest),
260 Capabilities,
261 #[derivative(Debug = "transparent")]
262 Search(SearchRequest),
263 #[derivative(Debug = "transparent")]
264 History(HistoryRequest),
265 #[derivative(Debug = "transparent")]
266 Invocation(InvocationRequest),
267 #[derivative(Debug = "transparent")]
268 Batch(FHIRBatchRequest),
269 #[derivative(Debug = "transparent")]
270 Transaction(FHIRTransactionRequest),
271 #[derivative(Debug = "transparent")]
272 Compartment(CompartmentRequest),
273}
274
275#[derive(Derivative, Clone)]
276#[derivative(Debug)]
277pub struct FHIRCreateResponse {
278 #[derivative(Debug(format_with = "crate::redact"))]
279 pub resource: Resource,
280}
281#[derive(Derivative, Clone)]
282#[derivative(Debug)]
283pub struct FHIRReadResponse {
284 #[derivative(Debug(format_with = "crate::redact"))]
285 pub resource: Option<Resource>,
286}
287#[derive(Derivative, Clone)]
288#[derivative(Debug)]
289pub struct FHIRVersionReadResponse {
290 #[derivative(Debug(format_with = "crate::redact"))]
291 pub resource: Resource,
292}
293#[derive(Derivative, Clone)]
294#[derivative(Debug)]
295pub struct FHIRUpdateResponse {
296 #[derivative(Debug(format_with = "crate::redact"))]
297 pub resource: Resource,
298}
299#[derive(Derivative, Clone)]
300#[derivative(Debug)]
301pub struct FHIRPatchResponse {
302 #[derivative(Debug(format_with = "crate::redact"))]
303 pub resource: Resource,
304}
305#[derive(Derivative, Clone)]
306#[derivative(Debug)]
307pub struct FHIRDeleteInstanceResponse {
308 #[derivative(Debug(format_with = "crate::redact"))]
309 pub resource: Resource,
310}
311#[derive(Derivative, Clone)]
312#[derivative(Debug)]
313pub struct FHIRDeleteTypeResponse {}
314#[derive(Derivative, Clone)]
315#[derivative(Debug)]
316pub struct FHIRDeleteSystemResponse {}
317#[derive(Derivative, Clone)]
318#[derivative(Debug)]
319pub struct FHIRCapabilitiesResponse {
320 pub capabilities: CapabilityStatement,
321}
322
323#[derive(Derivative, Clone)]
324#[derivative(Debug)]
325pub struct FHIRSearchTypeResponse {
326 #[derivative(Debug(format_with = "crate::redact"))]
327 pub bundle: Bundle,
328}
329#[derive(Derivative, Clone)]
330#[derivative(Debug)]
331pub struct FHIRSearchSystemResponse {
332 #[derivative(Debug(format_with = "crate::redact"))]
333 pub bundle: Bundle,
334}
335#[derive(Derivative, Clone)]
336#[derivative(Debug)]
337pub struct FHIRHistoryInstanceResponse {
338 #[derivative(Debug(format_with = "crate::redact"))]
339 pub bundle: Bundle,
340}
341#[derive(Derivative, Clone)]
342#[derivative(Debug)]
343pub struct FHIRHistoryTypeResponse {
344 #[derivative(Debug(format_with = "crate::redact"))]
345 pub bundle: Bundle,
346}
347#[derive(Derivative, Clone)]
348#[derivative(Debug)]
349pub struct FHIRHistorySystemResponse {
350 #[derivative(Debug(format_with = "crate::redact"))]
351 pub bundle: Bundle,
352}
353#[derive(Derivative, Clone)]
354#[derivative(Debug)]
355pub struct FHIRInvokeInstanceResponse {
356 #[derivative(Debug(format_with = "crate::redact"))]
357 pub resource: Resource,
358}
359#[derive(Derivative, Clone)]
360#[derivative(Debug)]
361pub struct FHIRInvokeTypeResponse {
362 #[derivative(Debug(format_with = "crate::redact"))]
363 pub resource: Resource,
364}
365#[derive(Derivative, Clone)]
366#[derivative(Debug)]
367pub struct FHIRInvokeSystemResponse {
368 #[derivative(Debug(format_with = "crate::redact"))]
369 pub resource: Resource,
370}
371#[derive(Derivative, Clone)]
372#[derivative(Debug)]
373pub struct FHIRBatchResponse {
374 #[derivative(Debug(format_with = "crate::redact"))]
375 pub resource: Bundle,
376}
377#[derive(Derivative, Clone)]
378#[derivative(Debug)]
379pub struct FHIRTransactionResponse {
380 #[derivative(Debug(format_with = "crate::redact"))]
381 pub resource: Bundle,
382}
383
384#[derive(Derivative, Clone)]
385#[derivative(Debug = "transparent")]
386pub enum HistoryResponse {
387 #[derivative(Debug = "transparent")]
388 Instance(FHIRHistoryInstanceResponse),
389 #[derivative(Debug = "transparent")]
390 Type(FHIRHistoryTypeResponse),
391 #[derivative(Debug = "transparent")]
392 System(FHIRHistorySystemResponse),
393}
394
395#[derive(Derivative, Clone)]
396#[derivative(Debug = "transparent")]
397pub enum SearchResponse {
398 #[derivative(Debug = "transparent")]
399 Type(FHIRSearchTypeResponse),
400 #[derivative(Debug = "transparent")]
401 System(FHIRSearchSystemResponse),
402}
403
404#[derive(Derivative, Clone)]
405#[derivative(Debug = "transparent")]
406pub enum DeleteResponse {
407 #[derivative(Debug = "transparent")]
408 Instance(Box<FHIRDeleteInstanceResponse>),
409 #[derivative(Debug = "transparent")]
410 Type(FHIRDeleteTypeResponse),
411 #[derivative(Debug = "transparent")]
412 System(FHIRDeleteSystemResponse),
413}
414
415#[derive(Derivative, Clone)]
416#[derivative(Debug = "transparent")]
417pub enum InvokeResponse {
418 #[derivative(Debug = "transparent")]
419 Instance(FHIRInvokeInstanceResponse),
420 #[derivative(Debug = "transparent")]
421 Type(FHIRInvokeTypeResponse),
422 #[derivative(Debug = "transparent")]
423 System(FHIRInvokeSystemResponse),
424}
425
426#[derive(Derivative, Clone)]
427#[derivative(Debug = "transparent")]
428pub enum FHIRResponse {
429 #[derivative(Debug = "transparent")]
430 Create(FHIRCreateResponse),
431 #[derivative(Debug = "transparent")]
432 Read(FHIRReadResponse),
433 #[derivative(Debug = "transparent")]
434 VersionRead(FHIRVersionReadResponse),
435 #[derivative(Debug = "transparent")]
436 Update(FHIRUpdateResponse),
437 #[derivative(Debug = "transparent")]
438 Patch(FHIRPatchResponse),
439 #[derivative(Debug = "transparent")]
440 Delete(DeleteResponse),
441 #[derivative(Debug = "transparent")]
442 Capabilities(FHIRCapabilitiesResponse),
443 #[derivative(Debug = "transparent")]
444 Search(SearchResponse),
445 #[derivative(Debug = "transparent")]
446 History(HistoryResponse),
447 #[derivative(Debug = "transparent")]
448 Invoke(InvokeResponse),
449 #[derivative(Debug = "transparent")]
450 Batch(FHIRBatchResponse),
451 #[derivative(Debug = "transparent")]
452 Transaction(FHIRTransactionResponse),
453}