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    #[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}