phenopacket_builder/v2/core/
phenotypic_feature.rs1use 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}