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}