teo_runtime/interface/field/
builder.rs

1use 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}