oxinat_core/models/data/
experiment.rs1use serde::{Deserialize, Serialize};
2
3use super::{Assessor, Project, Resource, Scan, Subject};
4use crate::models::common::FormatSpecifier;
5
6#[derive(Clone, Debug, Default, Deserialize, Serialize)]
7pub struct Experiment {
8 #[serde(skip_serializing_if = "Option::is_none")]
9 pub visit_id: Option<String>,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub date: Option<String>,
12 #[serde(rename = "ID")]
13 #[serde(skip_serializing_if = "Option::is_none")]
14 pub id: Option<String>,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub project: Option<String>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub label: Option<String>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub time: Option<String>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub note: Option<String>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub pi_firstname: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub pi_lastname: Option<String>,
27 #[serde(rename = "subject_ID")]
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub subject_id: Option<String>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub subject_label: Option<String>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub subject_project: Option<String>,
34 #[serde(rename = "URI")]
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub uri: Option<String>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub validation_method: Option<String>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub validation_status: Option<String>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub validation_date: Option<String>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub validation_notes: Option<String>,
45 #[serde(rename = "xsiType")]
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub xsi_type: Option<String>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
52 last_modified: Option<String>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 insert_date: Option<String>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 insert_user: Option<String>,
57
58 #[serde(skip_serializing_if = "Option::is_none")]
60 pub format: Option<FormatSpecifier>,
61
62 #[serde(skip_serializing)]
65 pub scans: Option<Vec<Scan>>,
66}
67
68impl Experiment {
69 pub fn last_modified(&self) -> &Option<String> {
71 &self.last_modified
72 }
73
74 pub fn insert_date(&self) -> &Option<String> {
76 &self.insert_date
77 }
78
79 pub fn insert_user(&self) -> &Option<String> {
81 &self.insert_user
82 }
83}
84
85impl From<Assessor> for Experiment {
86 fn from(value: Assessor) -> Self {
87 let mut inst = Self::default();
88 inst.id.clone_from(&value.session_id);
89 inst.label.clone_from(&value.session_label);
90 inst.project.clone_from(&value.project);
91 inst.subject_label.clone_from(&value.subject);
92
93 inst
94 }
95}
96
97impl From<Project> for Experiment {
98 fn from(value: Project) -> Self {
99 let mut inst = Self::default();
100 inst.project.clone_from(&value.id);
101 inst
102 }
103}
104
105impl From<Resource> for Experiment {
106 fn from(value: Resource) -> Self {
107 let mut inst = Self::default();
108 inst.label.clone_from(&value.experiment);
109 inst.project.clone_from(&value.project);
110 inst.subject_label.clone_from(&value.subject);
111
112 inst
113 }
114}
115
116impl From<Scan> for Experiment {
117 fn from(value: Scan) -> Self {
118 let mut inst = Self::default();
119 inst.label.clone_from(&value.experiment);
120 inst.project.clone_from(&value.project);
121 inst.subject_label.clone_from(&value.subject);
122
123 inst
124 }
125}
126
127impl From<Subject> for Experiment {
128 fn from(value: Subject) -> Self {
129 let mut inst = Self::default();
130 inst.project.clone_from(&value.project);
131 inst.subject_id.clone_from(&value.id);
132 inst
133 }
134}