Skip to main content

haste_fhir_client/
request.rs

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    pub fn new(name: &str) -> Result<Self, OperationParseError> {
133        let operation_name = name.trim_start_matches('$');
134        Ok(Operation(operation_name.to_string()))
135    }
136    pub fn name(&self) -> &str {
137        &self.0
138    }
139}
140
141#[derive(Derivative, Clone)]
142#[derivative(Debug)]
143pub struct FHIRInvokeInstanceRequest {
144    pub operation: Operation,
145    pub resource_type: ResourceType,
146    #[derivative(Debug(format_with = "crate::redact"))]
147    pub id: String,
148    pub parameters: Parameters,
149}
150
151#[derive(Derivative, Clone)]
152#[derivative(Debug)]
153pub struct FHIRInvokeTypeRequest {
154    pub operation: Operation,
155    pub resource_type: ResourceType,
156    pub parameters: Parameters,
157}
158
159#[derive(Derivative, Clone)]
160#[derivative(Debug)]
161pub struct FHIRInvokeSystemRequest {
162    pub operation: Operation,
163    pub parameters: Parameters,
164}
165
166#[derive(Derivative, Clone)]
167#[derivative(Debug)]
168pub struct FHIRBatchRequest {
169    #[derivative(Debug(format_with = "crate::redact"))]
170    pub resource: Bundle,
171}
172
173#[derive(Derivative, Clone)]
174#[derivative(Debug)]
175pub struct FHIRTransactionRequest {
176    #[derivative(Debug(format_with = "crate::redact"))]
177    pub resource: Bundle,
178}
179
180#[derive(Derivative, Clone)]
181#[derivative(Debug = "transparent")]
182pub enum InvocationRequest {
183    #[derivative(Debug = "transparent")]
184    Instance(FHIRInvokeInstanceRequest),
185    #[derivative(Debug = "transparent")]
186    Type(FHIRInvokeTypeRequest),
187    #[derivative(Debug = "transparent")]
188    System(FHIRInvokeSystemRequest),
189}
190
191#[derive(Derivative, Clone)]
192#[derivative(Debug = "transparent")]
193pub enum HistoryRequest {
194    #[derivative(Debug = "transparent")]
195    Instance(FHIRHistoryInstanceRequest),
196    #[derivative(Debug = "transparent")]
197    Type(FHIRHistoryTypeRequest),
198    #[derivative(Debug = "transparent")]
199    System(FHIRHistorySystemRequest),
200}
201
202#[derive(Derivative, Clone)]
203#[derivative(Debug = "transparent")]
204pub enum SearchRequest {
205    #[derivative(Debug = "transparent")]
206    Type(FHIRSearchTypeRequest),
207    #[derivative(Debug = "transparent")]
208    System(FHIRSearchSystemRequest),
209}
210
211#[derive(Derivative, Clone)]
212#[derivative(Debug = "transparent")]
213pub enum DeleteRequest {
214    #[derivative(Debug = "transparent")]
215    Instance(FHIRDeleteInstanceRequest),
216    #[derivative(Debug = "transparent")]
217    Type(FHIRDeleteTypeRequest),
218    #[derivative(Debug = "transparent")]
219    System(FHIRDeleteSystemRequest),
220}
221
222#[derive(Derivative, Clone)]
223#[derivative(Debug = "transparent")]
224pub enum UpdateRequest {
225    #[derivative(Debug = "transparent")]
226    Instance(FHIRUpdateInstanceRequest),
227    #[derivative(Debug = "transparent")]
228    Conditional(FHIRConditionalUpdateRequest),
229}
230
231#[derive(Derivative, Clone)]
232#[derivative(Debug)]
233pub struct CompartmentRequest {
234    pub resource_type: ResourceType,
235    #[derivative(Debug(format_with = "crate::redact"))]
236    pub id: String,
237    pub request: Box<FHIRRequest>,
238}
239
240#[derive(Derivative, Clone)]
241#[derivative(Debug = "transparent")]
242pub enum FHIRRequest {
243    #[derivative(Debug = "transparent")]
244    Create(FHIRCreateRequest),
245    #[derivative(Debug = "transparent")]
246    Read(FHIRReadRequest),
247    #[derivative(Debug = "transparent")]
248    VersionRead(FHIRVersionReadRequest),
249    #[derivative(Debug = "transparent")]
250    Update(UpdateRequest),
251    #[derivative(Debug = "transparent")]
252    Patch(FHIRPatchRequest),
253    #[derivative(Debug = "transparent")]
254    Delete(DeleteRequest),
255    Capabilities,
256    #[derivative(Debug = "transparent")]
257    Search(SearchRequest),
258    #[derivative(Debug = "transparent")]
259    History(HistoryRequest),
260    #[derivative(Debug = "transparent")]
261    Invocation(InvocationRequest),
262    #[derivative(Debug = "transparent")]
263    Batch(FHIRBatchRequest),
264    #[derivative(Debug = "transparent")]
265    Transaction(FHIRTransactionRequest),
266    #[derivative(Debug = "transparent")]
267    Compartment(CompartmentRequest),
268}
269#[derive(Derivative, Clone)]
270#[derivative(Debug)]
271pub struct FHIRCreateResponse {
272    #[derivative(Debug(format_with = "crate::redact"))]
273    pub resource: Resource,
274}
275#[derive(Derivative, Clone)]
276#[derivative(Debug)]
277pub struct FHIRReadResponse {
278    #[derivative(Debug(format_with = "crate::redact"))]
279    pub resource: Option<Resource>,
280}
281#[derive(Derivative, Clone)]
282#[derivative(Debug)]
283pub struct FHIRVersionReadResponse {
284    #[derivative(Debug(format_with = "crate::redact"))]
285    pub resource: Resource,
286}
287#[derive(Derivative, Clone)]
288#[derivative(Debug)]
289pub struct FHIRUpdateResponse {
290    #[derivative(Debug(format_with = "crate::redact"))]
291    pub resource: Resource,
292}
293#[derive(Derivative, Clone)]
294#[derivative(Debug)]
295pub struct FHIRPatchResponse {
296    #[derivative(Debug(format_with = "crate::redact"))]
297    pub resource: Resource,
298}
299#[derive(Derivative, Clone)]
300#[derivative(Debug)]
301pub struct FHIRDeleteInstanceResponse {
302    #[derivative(Debug(format_with = "crate::redact"))]
303    pub resource: Resource,
304}
305#[derive(Derivative, Clone)]
306#[derivative(Debug)]
307pub struct FHIRDeleteTypeResponse {}
308#[derive(Derivative, Clone)]
309#[derivative(Debug)]
310pub struct FHIRDeleteSystemResponse {}
311#[derive(Derivative, Clone)]
312#[derivative(Debug)]
313pub struct FHIRCapabilitiesResponse {
314    pub capabilities: CapabilityStatement,
315}
316
317#[derive(Derivative, Clone)]
318#[derivative(Debug)]
319pub struct FHIRSearchTypeResponse {
320    #[derivative(Debug(format_with = "crate::redact"))]
321    pub bundle: Bundle,
322}
323#[derive(Derivative, Clone)]
324#[derivative(Debug)]
325pub struct FHIRSearchSystemResponse {
326    #[derivative(Debug(format_with = "crate::redact"))]
327    pub bundle: Bundle,
328}
329#[derive(Derivative, Clone)]
330#[derivative(Debug)]
331pub struct FHIRHistoryInstanceResponse {
332    #[derivative(Debug(format_with = "crate::redact"))]
333    pub bundle: Bundle,
334}
335#[derive(Derivative, Clone)]
336#[derivative(Debug)]
337pub struct FHIRHistoryTypeResponse {
338    #[derivative(Debug(format_with = "crate::redact"))]
339    pub bundle: Bundle,
340}
341#[derive(Derivative, Clone)]
342#[derivative(Debug)]
343pub struct FHIRHistorySystemResponse {
344    #[derivative(Debug(format_with = "crate::redact"))]
345    pub bundle: Bundle,
346}
347#[derive(Derivative, Clone)]
348#[derivative(Debug)]
349pub struct FHIRInvokeInstanceResponse {
350    #[derivative(Debug(format_with = "crate::redact"))]
351    pub resource: Resource,
352}
353#[derive(Derivative, Clone)]
354#[derivative(Debug)]
355pub struct FHIRInvokeTypeResponse {
356    #[derivative(Debug(format_with = "crate::redact"))]
357    pub resource: Resource,
358}
359#[derive(Derivative, Clone)]
360#[derivative(Debug)]
361pub struct FHIRInvokeSystemResponse {
362    #[derivative(Debug(format_with = "crate::redact"))]
363    pub resource: Resource,
364}
365#[derive(Derivative, Clone)]
366#[derivative(Debug)]
367pub struct FHIRBatchResponse {
368    #[derivative(Debug(format_with = "crate::redact"))]
369    pub resource: Bundle,
370}
371#[derive(Derivative, Clone)]
372#[derivative(Debug)]
373pub struct FHIRTransactionResponse {
374    #[derivative(Debug(format_with = "crate::redact"))]
375    pub resource: Bundle,
376}
377
378#[derive(Derivative, Clone)]
379#[derivative(Debug = "transparent")]
380pub enum HistoryResponse {
381    #[derivative(Debug = "transparent")]
382    Instance(FHIRHistoryInstanceResponse),
383    #[derivative(Debug = "transparent")]
384    Type(FHIRHistoryTypeResponse),
385    #[derivative(Debug = "transparent")]
386    System(FHIRHistorySystemResponse),
387}
388
389#[derive(Derivative, Clone)]
390#[derivative(Debug = "transparent")]
391pub enum SearchResponse {
392    #[derivative(Debug = "transparent")]
393    Type(FHIRSearchTypeResponse),
394    #[derivative(Debug = "transparent")]
395    System(FHIRSearchSystemResponse),
396}
397
398#[derive(Derivative, Clone)]
399#[derivative(Debug = "transparent")]
400pub enum DeleteResponse {
401    #[derivative(Debug = "transparent")]
402    Instance(FHIRDeleteInstanceResponse),
403    #[derivative(Debug = "transparent")]
404    Type(FHIRDeleteTypeResponse),
405    #[derivative(Debug = "transparent")]
406    System(FHIRDeleteSystemResponse),
407}
408
409#[derive(Derivative, Clone)]
410#[derivative(Debug = "transparent")]
411pub enum InvokeResponse {
412    #[derivative(Debug = "transparent")]
413    Instance(FHIRInvokeInstanceResponse),
414    #[derivative(Debug = "transparent")]
415    Type(FHIRInvokeTypeResponse),
416    #[derivative(Debug = "transparent")]
417    System(FHIRInvokeSystemResponse),
418}
419
420#[derive(Derivative, Clone)]
421#[derivative(Debug = "transparent")]
422pub enum FHIRResponse {
423    #[derivative(Debug = "transparent")]
424    Create(FHIRCreateResponse),
425    #[derivative(Debug = "transparent")]
426    Read(FHIRReadResponse),
427    #[derivative(Debug = "transparent")]
428    VersionRead(FHIRVersionReadResponse),
429    #[derivative(Debug = "transparent")]
430    Update(FHIRUpdateResponse),
431    #[derivative(Debug = "transparent")]
432    Patch(FHIRPatchResponse),
433    #[derivative(Debug = "transparent")]
434    Delete(DeleteResponse),
435    #[derivative(Debug = "transparent")]
436    Capabilities(FHIRCapabilitiesResponse),
437    #[derivative(Debug = "transparent")]
438    Search(SearchResponse),
439    #[derivative(Debug = "transparent")]
440    History(HistoryResponse),
441    #[derivative(Debug = "transparent")]
442    Invoke(InvokeResponse),
443    #[derivative(Debug = "transparent")]
444    Batch(FHIRBatchResponse),
445    #[derivative(Debug = "transparent")]
446    Transaction(FHIRTransactionResponse),
447}