1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
//! SubscriptionTopic
//!
//! URL: http://hl7.org/fhir/StructureDefinition/SubscriptionTopic
//!
//! Version: 5.0.0
//!
//! SubscriptionTopic Resource: Describes a stream of resource state changes identified by trigger criteria and annotated with labels useful to filter projections from this topic.
//!
//! FHIR: <https://build.fhir.org/>
//!
//! UML: <https://build.fhir.org/uml.html>
// Allow unused crate::r5::types as types;
#![allow(unused_imports)]
use crate::r5::types;
use ::serde::{Deserialize, Serialize};
use fhir_derive_macros::Validate;
/// SubscriptionTopic
///
/// Describes a stream of resource state changes identified by trigger criteria
/// and annotated with labels useful to filter projections from this topic. A
/// SubscriptionTopic defines the interesting events that a server can notify
/// subscribers about, along with the filters and notification shapes those
/// subscribers may request. It is a canonical, shareable definition that
/// Subscription resources reference to describe the changes they wish to receive.
///
/// Administratively, a SubscriptionTopic acts as the contract between a FHIR
/// server and its clients for event-driven notifications: it specifies which
/// resource types can trigger a notification (via resource-based or
/// event-based triggers), which element-level or state-transition conditions
/// must hold for a trigger to fire, which parameters a client may use to
/// filter the notifications it receives, and the shape (included and
/// reverse-included content) of the payload that will be sent. Publishers
/// author SubscriptionTopics to describe the interesting changes they are
/// willing to notify about (for example, new orders, completed observations,
/// or changes to a patient's status), and clients then create individual
/// Subscription resources that reference a topic by canonical URL, apply
/// their own filters, and choose a delivery channel.
///
/// # Related resources
///
/// A SubscriptionTopic is referenced by `Subscription` resources, which
/// instantiate the topic for a specific client and delivery channel. Trigger
/// and filter definitions frequently reference clinical resources such as
/// [`Patient`](crate::r5::resources::patient::Patient) or use
/// [`CodeableConcept`](crate::r5::types::CodeableConcept) values to describe
/// triggering events.
///
/// # Examples
///
/// ```
/// use fhir::r5::resources::subscription_topic::SubscriptionTopic;
///
/// let value = SubscriptionTopic::default();
/// let json = ::serde_json::to_value(&value).unwrap();
/// let back: SubscriptionTopic = ::serde_json::from_value(json).unwrap();
/// assert_eq!(value, back);
/// ```
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionTopic {
/// Logical id of this artifact
pub id: Option<types::String>,
/// Metadata about the resource
pub meta: Option<types::Meta>,
/// A set of rules under which this content was created
pub implicit_rules: Option<types::Uri>,
/// Language of the resource content
pub language: Option<types::Code>,
/// Text summary of the resource, for human interpretation
pub text: Option<types::Narrative>,
/// Contained, inline Resources
pub contained: Option<Vec<::serde_json::Value>>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored
pub modifier_extension: Option<Vec<types::Extension>>,
/// Canonical identifier for this subscription topic, represented as an absolute URI (globally unique); this is the value a `Subscription` uses to reference the topic
pub url: types::Uri,
/// Business identifier for subscription topic
pub identifier: Option<Vec<types::Identifier>>,
/// Business version of the subscription topic
pub version: Option<types::String>,
/// How to compare versions
pub version_algorithm_string: Option<types::String>,
/// How to compare versions
pub version_algorithm_coding: Option<types::Coding>,
/// Name for this subscription topic (computer friendly)
pub name: Option<types::String>,
/// Name for this subscription topic (human friendly)
pub title: Option<types::String>,
/// Based on FHIR protocol or definition
pub derived_from: Option<Vec<types::Canonical>>,
/// The publication lifecycle status of this topic definition: draft | active | retired | unknown
pub status: types::Code,
/// If for testing purposes, not real usage
pub experimental: Option<types::Boolean>,
/// Date status first applied
pub date: Option<types::DateTime>,
/// The name of the individual or organization that published the SubscriptionTopic
pub publisher: Option<types::String>,
/// Contact details for the publisher
pub contact: Option<Vec<types::ContactDetail>>,
/// Natural language description of the SubscriptionTopic
pub description: Option<types::Markdown>,
/// Content intends to support these contexts
pub use_context: Option<Vec<types::UsageContext>>,
/// Intended jurisdiction of the SubscriptionTopic (if applicable)
pub jurisdiction: Option<Vec<types::CodeableConcept>>,
/// Why this SubscriptionTopic is defined
pub purpose: Option<types::Markdown>,
/// Use and/or publishing restrictions
pub copyright: Option<types::Markdown>,
/// Copyright holder and year(s)
pub copyright_label: Option<types::String>,
/// When SubscriptionTopic is/was approved by publisher
pub approval_date: Option<types::Date>,
/// Date the Subscription Topic was last reviewed by the publisher
pub last_review_date: Option<types::Date>,
/// The effective date range for the SubscriptionTopic
pub effective_period: Option<types::Period>,
/// Definition of a resource state change (create, update, delete) that can trigger a notification for this topic
pub resource_trigger: Option<Vec<SubscriptionTopicResourceTrigger>>,
/// Event definitions the SubscriptionTopic, describing coded events (rather than plain resource state changes) that can trigger a notification
pub event_trigger: Option<Vec<SubscriptionTopicEventTrigger>>,
/// Properties by which a Subscription can filter notifications from the SubscriptionTopic, exposed to clients via `Subscription.filterBy`
pub can_filter_by: Option<Vec<SubscriptionTopicCanFilterBy>>,
/// Properties for describing the shape of notifications generated by this topic, including included and reverse-included content
pub notification_shape: Option<Vec<SubscriptionTopicNotificationShape>>,
}
/// Definition of a resource-based trigger for the subscription topic.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionTopicResourceTrigger {
/// Unique id for inter-element referencing
pub id: Option<types::String>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored even if unrecognized
pub modifier_extension: Option<Vec<types::Extension>>,
/// Text representation of the resource trigger
pub description: Option<types::Markdown>,
/// Data Type or Resource (reference to definition) for this trigger definition
pub resource: types::Uri,
/// create | update | delete
pub supported_interaction: Option<Vec<types::Code>>,
/// Query based trigger rule
pub query_criteria: Option<SubscriptionTopicResourceTriggerQueryCriteria>,
/// FHIRPath based trigger rule
pub fhir_path_criteria: Option<types::String>,
}
/// Query based trigger rule for a resource-based trigger.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionTopicResourceTriggerQueryCriteria {
/// Unique id for inter-element referencing
pub id: Option<types::String>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored even if unrecognized
pub modifier_extension: Option<Vec<types::Extension>>,
/// Rule applied to previous resource state
pub previous: Option<types::String>,
/// test-passes | test-fails
pub result_for_create: Option<types::Code>,
/// Rule applied to current resource state
pub current: Option<types::String>,
/// test-passes | test-fails
pub result_for_delete: Option<types::Code>,
/// Both must be true flag
pub require_both: Option<types::Boolean>,
}
/// Event definitions the SubscriptionTopic.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionTopicEventTrigger {
/// Unique id for inter-element referencing
pub id: Option<types::String>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored even if unrecognized
pub modifier_extension: Option<Vec<types::Extension>>,
/// Text representation of the event trigger
pub description: Option<types::Markdown>,
/// Event which can trigger a notification from the SubscriptionTopic
pub event: types::CodeableConcept,
/// Data Type or Resource (reference to definition) for this trigger definition
pub resource: types::Uri,
}
/// Properties by which a Subscription can filter notifications from the SubscriptionTopic.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionTopicCanFilterBy {
/// Unique id for inter-element referencing
pub id: Option<types::String>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored even if unrecognized
pub modifier_extension: Option<Vec<types::Extension>>,
/// Description of this filter parameter
pub description: Option<types::Markdown>,
/// URL of the triggering Resource that this filter applies to
pub resource: Option<types::Uri>,
/// Human-readable and computation-friendly name for a filter parameter usable by subscriptions on this topic, via Subscription.filterBy.filterParameter
pub filter_parameter: types::String,
/// Canonical URL for a filterParameter definition
pub filter_definition: Option<types::Uri>,
/// eq | ne | gt | lt | ge | le | sa | eb | ap
pub comparator: Option<Vec<types::Code>>,
/// missing | exact | contains | not | text | in | not-in | below | above | type | identifier | of-type | code-text | text-advanced | iterate
pub modifier: Option<Vec<types::Code>>,
}
/// Properties for describing the shape of notifications generated by this topic.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionTopicNotificationShape {
/// Unique id for inter-element referencing
pub id: Option<types::String>,
/// Additional content defined by implementations
pub extension: Option<Vec<types::Extension>>,
/// Extensions that cannot be ignored even if unrecognized
pub modifier_extension: Option<Vec<types::Extension>>,
/// URL of the Resource that is the focus (main) resource in a notification shape
pub resource: types::Uri,
/// Include directives, rooted in the resource for this shape
pub include: Option<Vec<types::String>>,
/// Reverse include directives, rooted in the resource for this shape
pub rev_include: Option<Vec<types::String>>,
}
#[cfg(test)]
mod tests {
use super::*;
type T = SubscriptionTopic;
#[test]
fn test_default() {
let _ = T::default();
}
#[test]
fn test_serde_round_trip() {
let value = T::default();
let json = ::serde_json::to_value(&value).expect("to_value");
let back: T = ::serde_json::from_value(json).expect("from_value");
assert_eq!(value, back);
}
}