1use haste_fhir_model::r4::generated::resources::{
2 Bundle, CapabilityStatement, Parameters, Resource, ResourceType,
3};
4use haste_jwt::VersionId;
5use json_patch::Patch;
6use thiserror::Error;
7
8use crate::url::ParsedParameters;
9
10#[derive(Debug, Clone)]
11pub struct FHIRCreateRequest {
12 pub resource_type: ResourceType,
13 pub resource: Resource,
14}
15
16#[derive(Debug, Clone)]
17pub struct FHIRReadRequest {
18 pub resource_type: ResourceType,
19 pub id: String,
20}
21
22#[derive(Debug, Clone)]
23pub struct FHIRVersionReadRequest {
24 pub resource_type: ResourceType,
25 pub id: String,
26 pub version_id: VersionId,
27}
28
29#[derive(Debug, Clone)]
30pub struct FHIRUpdateInstanceRequest {
31 pub resource_type: ResourceType,
32 pub id: String,
33 pub resource: Resource,
34}
35
36#[derive(Debug, Clone)]
37pub struct FHIRConditionalUpdateRequest {
38 pub resource_type: ResourceType,
39 pub parameters: ParsedParameters,
40 pub resource: Resource,
41}
42
43#[derive(Debug, Clone)]
44pub struct FHIRPatchRequest {
45 pub resource_type: ResourceType,
46 pub id: String,
47 pub patch: Patch,
48}
49
50#[derive(Debug, Clone)]
51pub struct FHIRHistoryInstanceRequest {
52 pub resource_type: ResourceType,
53 pub id: String,
54 pub parameters: ParsedParameters,
55}
56
57#[derive(Debug, Clone)]
58pub struct FHIRHistoryTypeRequest {
59 pub resource_type: ResourceType,
60 pub parameters: ParsedParameters,
61}
62
63#[derive(Debug, Clone)]
64pub struct FHIRHistorySystemRequest {
65 pub parameters: ParsedParameters,
66}
67
68#[derive(Debug, Clone)]
69pub struct FHIRDeleteInstanceRequest {
70 pub resource_type: ResourceType,
71 pub id: String,
72}
73
74#[derive(Debug, Clone)]
75pub struct FHIRDeleteTypeRequest {
76 pub resource_type: ResourceType,
77 pub parameters: ParsedParameters,
78}
79
80#[derive(Debug, Clone)]
81pub struct FHIRDeleteSystemRequest {
82 pub parameters: ParsedParameters,
83}
84
85#[derive(Debug, Clone)]
86pub struct FHIRSearchTypeRequest {
87 pub resource_type: ResourceType,
88 pub parameters: ParsedParameters,
89}
90
91#[derive(Debug, Clone)]
92pub struct FHIRSearchSystemRequest {
93 pub parameters: ParsedParameters,
94}
95
96#[derive(Error, Debug)]
97pub enum OperationParseError {
98 #[error("Invalid operation name")]
99 Invalid,
100}
101
102#[derive(Debug, Clone)]
103pub struct Operation(String);
104impl Operation {
105 pub fn new(name: &str) -> Result<Self, OperationParseError> {
106 let operation_name = name.trim_start_matches('$');
107 Ok(Operation(operation_name.to_string()))
108 }
109 pub fn name(&self) -> &str {
110 &self.0
111 }
112}
113
114#[derive(Debug, Clone)]
115pub struct FHIRInvokeInstanceRequest {
116 pub operation: Operation,
117 pub resource_type: ResourceType,
118 pub id: String,
119 pub parameters: Parameters,
120}
121
122#[derive(Debug, Clone)]
123pub struct FHIRInvokeTypeRequest {
124 pub operation: Operation,
125 pub resource_type: ResourceType,
126 pub parameters: Parameters,
127}
128
129#[derive(Debug, Clone)]
130pub struct FHIRInvokeSystemRequest {
131 pub operation: Operation,
132 pub parameters: Parameters,
133}
134
135#[derive(Debug, Clone)]
136pub struct FHIRBatchRequest {
137 pub resource: Bundle,
138}
139
140#[derive(Debug, Clone)]
141pub struct FHIRTransactionRequest {
142 pub resource: Bundle,
143}
144
145#[derive(Debug, Clone)]
146pub enum InvocationRequest {
147 Instance(FHIRInvokeInstanceRequest),
148 Type(FHIRInvokeTypeRequest),
149 System(FHIRInvokeSystemRequest),
150}
151
152#[derive(Debug, Clone)]
153pub enum HistoryRequest {
154 Instance(FHIRHistoryInstanceRequest),
155 Type(FHIRHistoryTypeRequest),
156 System(FHIRHistorySystemRequest),
157}
158
159#[derive(Debug, Clone)]
160pub enum SearchRequest {
161 Type(FHIRSearchTypeRequest),
162 System(FHIRSearchSystemRequest),
163}
164
165#[derive(Debug, Clone)]
166pub enum DeleteRequest {
167 Instance(FHIRDeleteInstanceRequest),
168 Type(FHIRDeleteTypeRequest),
169 System(FHIRDeleteSystemRequest),
170}
171
172#[derive(Debug, Clone)]
173pub enum UpdateRequest {
174 Instance(FHIRUpdateInstanceRequest),
175 Conditional(FHIRConditionalUpdateRequest),
176}
177
178#[derive(Debug, Clone)]
179pub struct CompartmentRequest {
180 pub resource_type: ResourceType,
181 pub id: String,
182 pub request: Box<FHIRRequest>,
183}
184
185#[derive(Debug, Clone)]
186pub enum FHIRRequest {
187 Create(FHIRCreateRequest),
188
189 Read(FHIRReadRequest),
190 VersionRead(FHIRVersionReadRequest),
191
192 Update(UpdateRequest),
193
194 Patch(FHIRPatchRequest),
195
196 Delete(DeleteRequest),
197
198 Capabilities,
199
200 Search(SearchRequest),
201
202 History(HistoryRequest),
203
204 Invocation(InvocationRequest),
205
206 Batch(FHIRBatchRequest),
207 Transaction(FHIRTransactionRequest),
208
209 Compartment(CompartmentRequest),
210}
211#[derive(Debug, Clone)]
212pub struct FHIRCreateResponse {
213 pub resource: Resource,
214}
215#[derive(Debug, Clone)]
216pub struct FHIRReadResponse {
217 pub resource: Option<Resource>,
218}
219#[derive(Debug, Clone)]
220pub struct FHIRVersionReadResponse {
221 pub resource: Resource,
222}
223#[derive(Debug, Clone)]
224pub struct FHIRUpdateResponse {
225 pub resource: Resource,
226}
227#[derive(Debug, Clone)]
228pub struct FHIRPatchResponse {
229 pub resource: Resource,
230}
231#[derive(Debug, Clone)]
232pub struct FHIRDeleteInstanceResponse {
233 pub resource: Resource,
234}
235#[derive(Debug, Clone)]
236pub struct FHIRDeleteTypeResponse {}
237#[derive(Debug, Clone)]
238pub struct FHIRDeleteSystemResponse {}
239#[derive(Debug, Clone)]
240pub struct FHIRCapabilitiesResponse {
241 pub capabilities: CapabilityStatement,
242}
243
244#[derive(Debug, Clone)]
245pub struct FHIRSearchTypeResponse {
246 pub bundle: Bundle,
247}
248#[derive(Debug, Clone)]
249pub struct FHIRSearchSystemResponse {
250 pub bundle: Bundle,
251}
252#[derive(Debug, Clone)]
253pub struct FHIRHistoryInstanceResponse {
254 pub bundle: Bundle,
255}
256#[derive(Debug, Clone)]
257pub struct FHIRHistoryTypeResponse {
258 pub bundle: Bundle,
259}
260#[derive(Debug, Clone)]
261pub struct FHIRHistorySystemResponse {
262 pub bundle: Bundle,
263}
264#[derive(Debug, Clone)]
265pub struct FHIRInvokeInstanceResponse {
266 pub resource: Resource,
267}
268#[derive(Debug, Clone)]
269pub struct FHIRInvokeTypeResponse {
270 pub resource: Resource,
271}
272#[derive(Debug, Clone)]
273pub struct FHIRInvokeSystemResponse {
274 pub resource: Resource,
275}
276#[derive(Debug, Clone)]
277pub struct FHIRBatchResponse {
278 pub resource: Bundle,
279}
280#[derive(Debug, Clone)]
281pub struct FHIRTransactionResponse {
282 pub resource: Bundle,
283}
284
285#[derive(Debug, Clone)]
286pub enum HistoryResponse {
287 Instance(FHIRHistoryInstanceResponse),
288 Type(FHIRHistoryTypeResponse),
289 System(FHIRHistorySystemResponse),
290}
291
292#[derive(Debug, Clone)]
293pub enum SearchResponse {
294 Type(FHIRSearchTypeResponse),
295 System(FHIRSearchSystemResponse),
296}
297
298#[derive(Debug, Clone)]
299pub enum DeleteResponse {
300 Instance(FHIRDeleteInstanceResponse),
301 Type(FHIRDeleteTypeResponse),
302 System(FHIRDeleteSystemResponse),
303}
304
305#[derive(Debug, Clone)]
306pub enum InvokeResponse {
307 Instance(FHIRInvokeInstanceResponse),
308 Type(FHIRInvokeTypeResponse),
309 System(FHIRInvokeSystemResponse),
310}
311
312#[derive(Debug, Clone)]
313pub enum FHIRResponse {
314 Create(FHIRCreateResponse),
315
316 Read(FHIRReadResponse),
317 VersionRead(FHIRVersionReadResponse),
318
319 Update(FHIRUpdateResponse),
320
321 Patch(FHIRPatchResponse),
322
323 Delete(DeleteResponse),
324
325 Capabilities(FHIRCapabilitiesResponse),
326
327 Search(SearchResponse),
328
329 History(HistoryResponse),
330
331 Invoke(InvokeResponse),
332
333 Batch(FHIRBatchResponse),
334 Transaction(FHIRTransactionResponse),
335}