teo_runtime/enum/member/
builder.rs

1use std::collections::BTreeMap;
2use std::sync::{Arc, Mutex};
3use crate::app::data::AppData;
4use crate::comment::Comment;
5use crate::r#enum::member::Member;
6use crate::Value;
7
8#[derive(Debug, Clone)]
9pub struct Builder {
10    inner: Arc<Inner>
11}
12
13#[derive(Debug)]
14struct Inner {
15    name: String,
16    comment: Option<Comment>,
17    value: Value,
18    data: Arc<Mutex<BTreeMap<String, Value>>>,
19    app_data: AppData,
20}
21
22impl Builder {
23
24    pub fn new(name: String, value: Value, comment: Option<Comment>, app_data: AppData) -> Self {
25        Self {
26            inner: Arc::new(Inner {
27                name,
28                value,
29                comment,
30                data: Arc::new(Mutex::new(BTreeMap::new())),
31                app_data,
32            })
33        }
34    }
35
36    pub fn name(&self) -> &str {
37        &self.inner.name
38    }
39
40    pub fn comment(&self) -> Option<&Comment> {
41        self.inner.comment.as_ref()
42    }
43
44    pub fn value(&self) -> &Value {
45        &self.inner.value
46    }
47
48    pub fn data(&self) -> BTreeMap<String, Value> {
49        self.inner.data.lock().unwrap().clone()
50    }
51
52    pub fn set_data(&self, data: BTreeMap<String, Value>) {
53        *self.inner.data.lock().unwrap() = data;
54    }
55
56    pub fn insert_data_entry(&self, key: String, value: Value) {
57        self.inner.data.lock().unwrap().insert(key, value);
58    }
59
60    pub fn remove_data_entry(&self, key: &str) {
61        self.inner.data.lock().unwrap().remove(key);
62    }
63
64    pub fn data_entry(&self, key: &str) -> Option<Value> {
65        self.inner.data.lock().unwrap().get(key).cloned()
66    }
67
68    pub(crate) fn build(self) -> Member {
69        Member {
70            name: self.inner.name.clone(),
71            value: self.inner.value.clone(),
72            comment: self.inner.comment.clone(),
73            data: self.inner.data.lock().unwrap().clone(),
74        }
75    }
76
77    pub fn app_data(&self) -> &AppData {
78        &self.inner.app_data
79    }
80}