oxinat_core/models/data/
experiment.rs

1use 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    // Read-only fields not meant for only for the
50    // host to modify.
51    #[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    // Extra query specifiers.
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub format: Option<FormatSpecifier>,
61
62    // Additional data that can be utilized at
63    // runtime.
64    #[serde(skip_serializing)]
65    pub scans: Option<Vec<Scan>>,
66}
67
68impl Experiment {
69    /// Get READ-ONLY last-modified datetime.
70    pub fn last_modified(&self) -> &Option<String> {
71        &self.last_modified
72    }
73
74    /// Get READ-ONLY insert-date datetime.
75    pub fn insert_date(&self) -> &Option<String> {
76        &self.insert_date
77    }
78
79    /// Get READ-ONLY insert-user name.
80    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}