teo_runtime/interface/field/
builder.rs1use std::collections::BTreeMap;
2use std::sync::{Arc, Mutex};
3use teo_parser::r#type::Type;
4use crate::comment::Comment;
5use crate::interface::Field;
6use crate::model::field::set_optional::SetOptional;
7use crate::optionality::Optionality;
8use crate::Value;
9
10pub struct Builder {
11 inner: Arc<Inner>,
12}
13
14struct Inner {
15 name: String,
16 comment: Option<Comment>,
17 r#type: Type,
18 optionality: Arc<Mutex<Optionality>>,
19 data: Arc<Mutex<BTreeMap<String, Value>>>
20}
21
22impl Builder {
23 pub fn new(name: String, comment: Option<Comment>, r#type: Type) -> Self {
24 Self {
25 inner: Arc::new(Inner {
26 name,
27 comment,
28 r#type,
29 optionality: Arc::new(Mutex::new(Optionality::Required)),
30 data: Arc::new(Mutex::new(BTreeMap::new())),
31 })
32 }
33 }
34
35 pub fn name(&self) -> &str {
36 &self.inner.name
37 }
38
39 pub fn comment(&self) -> Option<&Comment> {
40 self.inner.comment.as_ref()
41 }
42
43 pub fn r#type(&self) -> &Type {
44 &self.inner.r#type
45 }
46
47 pub fn optionality(&self) -> Optionality {
48 self.inner.optionality.lock().unwrap().clone()
49 }
50
51 pub fn set_optionality(&self, optionality: Optionality) {
52 *self.inner.optionality.lock().unwrap() = optionality;
53 }
54
55 pub fn data(&self) -> BTreeMap<String, Value> {
56 self.inner.data.lock().unwrap().clone()
57 }
58
59 pub fn insert_data_entry(&self, key: String, value: Value) {
60 self.inner.data.lock().unwrap().insert(key, value);
61 }
62
63 pub fn remove_data_entry(&self, key: &str) {
64 self.inner.data.lock().unwrap().remove(key);
65 }
66
67 pub fn set_data(&self, data: BTreeMap<String, Value>) {
68 *self.inner.data.lock().unwrap() = data;
69 }
70
71 pub fn data_entry(&self, key: &str) -> Option<Value> {
72 self.inner.data.lock().unwrap().get(key).cloned()
73 }
74
75 pub(crate) fn build(self) -> Field {
76 Field {
77 name: self.inner.name.clone(),
78 comment: self.inner.comment.clone(),
79 r#type: self.inner.r#type.clone(),
80 optionality: self.optionality(),
81 data: self.data(),
82 }
83 }
84}
85
86impl SetOptional for Builder {
87 fn set_optional(&self) {
88 self.set_optionality(Optionality::Optional);
89 }
90
91 fn set_required(&self) {
92 self.set_optionality(Optionality::Required);
93 }
94}