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
//! ResearchSubject
//!
//! URL: http://hl7.org/fhir/StructureDefinition/ResearchSubject
//!
//! Version: 5.0.0
//!
//! ResearchSubject Resource: A ResearchSubject is a participant or object which is the recipient of investigative activities in a research study.
//!
//! 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 ResearchSubject is a participant or object which is the recipient of
/// investigative activities in a research study.
///
/// A ResearchSubject links a subject (such as a patient, group, specimen, or
/// device) to a specific ResearchStudy and records the details of that subject's
/// participation. It tracks the subject's status over time through a series of
/// progress states and milestones, the period of participation, and the
/// comparison group (arm) the subject was assigned to and actually followed. In
/// FHIR R5 it is commonly used to manage enrollment and consent within clinical
/// trials and other research activities.
///
/// Administratively, ResearchSubject acts as the join point between a research
/// study and the real-world entity taking part in it, allowing researchers,
/// coordinators, and downstream systems to answer questions such as who is
/// currently enrolled, which arm of the study a subject followed, when
/// participation began and ended, and what consent was obtained. Because the
/// resource captures identity, status, and study linkage separately from
/// clinical observations, it can be used alongside other resources to drive
/// eligibility screening, protocol deviation tracking, and study reporting
/// without duplicating clinical data already recorded elsewhere.
///
/// # Related resources
///
/// - `ResearchStudy` — the study this subject is participating in (referenced by `study`).
/// - [`Patient`](crate::r5::resources::patient::Patient) — a common type of
/// entity referenced by `subject`, though `subject` may also reference a
/// group, specimen, or device.
/// - [`CodeableConcept`](crate::r5::types::CodeableConcept) — used for
/// `progress.type`, `progress.subject_state`, `progress.milestone`, and
/// `progress.reason`.
/// - [`Reference`](crate::r5::types::Reference) — used for `study`, `subject`,
/// and `consent`.
///
/// # Examples
///
/// ```
/// use fhir::r5::resources::research_subject::ResearchSubject;
///
/// let value = ResearchSubject::default();
/// let json = ::serde_json::to_value(&value).unwrap();
/// let back: ResearchSubject = ::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 ResearchSubject {
/// 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>>,
/// Business Identifier for research subject in a study
pub identifier: Option<Vec<types::Identifier>>,
/// The overall lifecycle status of this record: draft | active | retired | unknown.
pub status: types::Code,
/// A chronological record of the subject's states and milestones (such as
/// screening, enrollment, or withdrawal) during the study.
pub progress: Option<Vec<ResearchSubjectProgress>>,
/// The overall start and end date of the subject's participation in the study.
pub period: Option<types::Period>,
/// Reference to the `ResearchStudy` that this subject is participating in.
pub study: types::Reference,
/// Reference to the individual or entity (for example a
/// [`Patient`](crate::r5::resources::patient::Patient), group, specimen,
/// or device) that is the subject of the research.
pub subject: types::Reference,
/// What path should be followed
pub assigned_comparison_group: Option<types::Id>,
/// What path was followed
pub actual_comparison_group: Option<types::Id>,
/// Agreement to participate in study
pub consent: Option<Vec<types::Reference>>,
}
/// Subject status.
///
/// Records the current and historical states and milestones a research subject
/// has passed through during participation in a study, along with the reason and
/// dates for each state change.
#[serde_with::skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq, Validate)]
#[serde(rename_all = "camelCase")]
pub struct ResearchSubjectProgress {
/// 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>>,
/// state | milestone
pub r#type: Option<types::CodeableConcept>,
/// candidate | eligible | follow-up | ineligible | not-registered |
/// off-study | on-study | on-study-intervention | on-study-observation |
/// pending-on-study | potential-candidate | screening | withdrawn
pub subject_state: Option<types::CodeableConcept>,
/// SignedUp | Screened | Randomized
pub milestone: Option<types::CodeableConcept>,
/// State change reason
pub reason: Option<types::CodeableConcept>,
/// State change date
pub start_date: Option<types::DateTime>,
/// State change date
pub end_date: Option<types::DateTime>,
}
#[cfg(test)]
mod tests {
use super::*;
type T = ResearchSubject;
#[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);
}
}