phenopacket_builder/v2/core/
phenotypic_feature.rs

1use crate::{Build, Buildable, Set, Unset};
2use phenopackets::schema::v2::core::{Evidence, OntologyClass, PhenotypicFeature, TimeElement};
3use std::marker::PhantomData;
4
5#[derive(Debug, Default, Clone, PartialEq)]
6pub struct PhenotypicFeatureBuilder<T = Unset> {
7    description: Option<String>,
8    r#type: Option<OntologyClass>,
9    excluded: bool,
10    severity: Option<OntologyClass>,
11    modifiers: Vec<OntologyClass>,
12    onset: Option<TimeElement>,
13    resolution: Option<TimeElement>,
14    evidence: Vec<Evidence>,
15    data: PhantomData<T>,
16}
17
18impl PhenotypicFeatureBuilder<Unset> {
19    pub fn r#type(self, r#type: impl Build<OntologyClass>) -> PhenotypicFeatureBuilder<Set> {
20        PhenotypicFeatureBuilder {
21            description: self.description,
22            r#type: Some(r#type.build()),
23            excluded: self.excluded,
24            severity: self.severity,
25            modifiers: self.modifiers,
26            onset: self.onset,
27            resolution: self.resolution,
28            evidence: self.evidence,
29            data: Default::default(),
30        }
31    }
32}
33
34impl<T> PhenotypicFeatureBuilder<T> {
35    pub fn description(mut self, description: impl Build<String>) -> PhenotypicFeatureBuilder<T> {
36        self.description = Some(description.build());
37        self
38    }
39
40    pub fn observed(mut self) -> PhenotypicFeatureBuilder<T> {
41        self.excluded = false;
42        self
43    }
44
45    pub fn excluded(mut self) -> PhenotypicFeatureBuilder<T> {
46        self.excluded = true;
47        self
48    }
49
50    pub fn severity(mut self, severity: impl Build<OntologyClass>) -> PhenotypicFeatureBuilder<T> {
51        self.severity = Some(severity.build());
52        self
53    }
54
55    pub fn add_modifier(
56        mut self,
57        modifier: impl Build<OntologyClass>,
58    ) -> PhenotypicFeatureBuilder<T> {
59        self.modifiers.push(modifier.build());
60        self
61    }
62
63    pub fn extend_modifiers(
64        mut self,
65        modifiers: impl IntoIterator<Item = impl Build<OntologyClass>>,
66    ) -> PhenotypicFeatureBuilder<T> {
67        self.modifiers
68            .extend(modifiers.into_iter().map(Build::build));
69        self
70    }
71
72    pub fn clear_modifiers(mut self) -> PhenotypicFeatureBuilder<T> {
73        self.modifiers.clear();
74        self
75    }
76
77    pub fn onset(mut self, onset: impl Build<TimeElement>) -> PhenotypicFeatureBuilder<T> {
78        self.onset = Some(onset.build());
79        self
80    }
81
82    pub fn resolution(
83        mut self,
84        resolution: impl Build<TimeElement>,
85    ) -> PhenotypicFeatureBuilder<T> {
86        self.resolution = Some(resolution.build());
87        self
88    }
89
90    pub fn add_evidence(mut self, evidence: impl Build<Evidence>) -> PhenotypicFeatureBuilder<T> {
91        self.evidence.push(evidence.build());
92        self
93    }
94
95    pub fn extend_evidence(
96        mut self,
97        evidence: impl IntoIterator<Item = impl Build<Evidence>>,
98    ) -> PhenotypicFeatureBuilder<T> {
99        self.evidence.extend(evidence.into_iter().map(Build::build));
100        self
101    }
102
103    pub fn clear_evidence(mut self) -> PhenotypicFeatureBuilder<T> {
104        self.evidence.clear();
105        self
106    }
107}
108
109impl Buildable for PhenotypicFeature {
110    type Builder = PhenotypicFeatureBuilder;
111}
112
113impl Build<PhenotypicFeature> for PhenotypicFeatureBuilder<Set> {
114    fn build(self) -> PhenotypicFeature {
115        PhenotypicFeature {
116            description: self.description.unwrap_or_default(),
117            r#type: self.r#type,
118            excluded: self.excluded,
119            severity: self.severity,
120            modifiers: self.modifiers,
121            onset: self.onset,
122            resolution: self.resolution,
123            evidence: self.evidence,
124        }
125    }
126}