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
//! Composition
//!
//! URL: http://hl7.org/fhir/StructureDefinition/Composition
//!
//! Version: 5.0.0
//!
//! Composition Resource: A set of healthcare-related information that is assembled together into a single logical package that provides a single coherent statement of meaning, establishes its own context and that has clinical attestation with regard to who is making the statement.
//!
//! 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;
/// A set of healthcare-related information that is assembled together into a
/// single logical package.
///
/// A Composition establishes a single coherent statement of meaning, defines
/// its own context, and carries clinical attestation regarding who is making
/// the statement. It provides the structure and narrative content necessary for
/// a clinical document, organized into sections. In FHIR R5 a Composition alone
/// does not constitute a document; it is typically the first entry in a Bundle
/// of type "document" that packages the referenced resources together.
///
/// Compositions are used to represent discharge summaries, consultation notes,
/// diagnostic reports, care plans, and other attested clinical or administrative
/// documents. Each Composition has exactly one `subject` context (commonly a
/// patient) though implementations may reference multiple related subjects, a
/// responsible `author`, a `status` reflecting its lifecycle, and one or more
/// `section` elements that hold the narrative and referenced entries making up
/// the body of the document. Once a Composition is part of a signed or attested
/// document, its content is generally considered immutable; a new `version` or a
/// document addendum is used to record subsequent changes.
///
/// # Related resources
///
/// A Composition typically references a [`Patient`](crate::r5::resources::patient::Patient)
/// or other resource as its subject, is authored and attested by practitioners or
/// organizations via `Reference`, and classifies its type and section codes using
/// [`CodeableConcept`](crate::r5::types::CodeableConcept). See also the `DocumentReference`
/// and `Bundle` resources, which are commonly used together with Composition to
/// index and package a complete clinical document.
///
/// # Examples
///
/// ```
/// use fhir::r5::resources::composition::Composition;
///
/// let value = Composition::default();
/// let json = ::serde_json::to_value(&value).unwrap();
/// let back: Composition = ::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 Composition {
/// 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 Composition, represented as a URI (globally unique)
pub url: Option<types::Uri>,
/// Version-independent identifier for the Composition
pub identifier: Option<Vec<types::Identifier>>,
/// An explicitly assigned identifer of a variation of the content in the Composition
pub version: Option<types::String>,
/// The workflow/clinical status of this composition: registered | partial | preliminary | final | amended | corrected | appended | cancelled | entered-in-error | deprecated | unknown
pub status: types::Code,
/// Kind of composition, such as a discharge summary or progress note (LOINC code preferred if possible)
pub r#type: types::CodeableConcept,
/// Categorization of Composition
pub category: Option<Vec<types::CodeableConcept>>,
/// Who and/or what the composition is about, most often the patient or subject of the document
pub subject: Option<Vec<types::Reference>>,
/// Context of the Composition
pub encounter: Option<types::Reference>,
/// Composition editing time, the time the document was last logically attested or edited
pub date: types::DateTime,
/// The context that the content is intended to support
pub use_context: Option<Vec<types::UsageContext>>,
/// Who and/or what authored the composition, such as a practitioner or organization
pub author: Vec<types::Reference>,
/// Name for this Composition (computer friendly)
pub name: Option<types::String>,
/// Human readable name/title, for example "Discharge Summary"
pub title: types::String,
/// For any additional notes
pub note: Option<Vec<types::Annotation>>,
/// Attests to accuracy of composition
pub attester: Option<Vec<CompositionAttester>>,
/// Organization which maintains the composition
pub custodian: Option<types::Reference>,
/// Relationships to other compositions/documents
pub relates_to: Option<Vec<types::RelatedArtifact>>,
/// The clinical service(s) being documented
pub event: Option<Vec<CompositionEvent>>,
/// Composition is broken into sections
pub section: Option<Vec<CompositionSection>>,
}
/// Attests to accuracy of composition.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct CompositionAttester {
/// 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>>,
/// personal | professional | legal | official
pub mode: types::CodeableConcept,
/// When the composition was attested
pub time: Option<types::DateTime>,
/// Who attested the composition
pub party: Option<types::Reference>,
}
/// The clinical service(s) being documented.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct CompositionEvent {
/// 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>>,
/// The period covered by the documentation
pub period: Option<types::Period>,
/// The event(s) being documented, as code(s), reference(s), or both
pub detail: Option<Vec<types::CodeableReference>>,
}
/// Composition is broken into sections.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct CompositionSection {
/// 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>>,
/// Label for section (e.g. for ToC)
pub title: Option<types::String>,
/// Classification of section (recommended)
pub code: Option<types::CodeableConcept>,
/// Who and/or what authored the section
pub author: Option<Vec<types::Reference>>,
/// Who/what the section is about, when it is not about the subject of composition
pub focus: Option<types::Reference>,
/// Text summary of the section, for human interpretation
pub text: Option<types::Narrative>,
/// Order of section entries
pub ordered_by: Option<types::CodeableConcept>,
/// A reference to data that supports this section
pub entry: Option<Vec<types::Reference>>,
/// Why the section is empty
pub empty_reason: Option<types::CodeableConcept>,
/// Nested Section
pub section: Option<Vec<CompositionSection>>,
}
#[cfg(test)]
mod tests {
use super::*;
type T = Composition;
#[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);
}
}