muzzman_lib/
element.rs

1use std::{
2    fmt::Debug,
3    hash::Hash,
4    sync::{Arc, RwLock},
5    thread::JoinHandle,
6};
7
8use serde::{Deserialize, Serialize};
9
10use crate::prelude::*;
11use bytes_kman::TBytes;
12
13#[derive(Debug, Clone, Serialize, Deserialize, bytes_kman::Bytes)]
14pub enum ElementNotify {
15    Complited,
16    ModuleChanged(Option<ModuleId>),
17    StatusChanged(usize),
18    Progress(f32),
19}
20
21impl_get_ref!(ElementNotify);
22
23#[derive(
24    Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, bytes_kman::Bytes,
25)]
26pub struct ElementId {
27    pub uid: u64,
28    pub location_id: LocationId,
29}
30
31impl ElementId {
32    pub fn into_ref(self, session: Box<dyn TSession>) -> RefElement {
33        RefElement {
34            session: Some(session),
35            id: self,
36        }
37    }
38}
39
40#[derive(Serialize, Deserialize)]
41pub struct RefElement {
42    #[serde(skip)]
43    pub session: Option<Box<dyn TSession>>,
44    pub id: ElementId,
45}
46
47unsafe impl Sync for RefElement {}
48unsafe impl Send for RefElement {}
49
50impl Debug for RefElement {
51    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52        f.debug_struct("RefElement").field("id", &self.id).finish()
53    }
54}
55
56impl PartialEq for RefElement {
57    fn eq(&self, other: &Self) -> bool {
58        self.id.eq(&other.id) && self.id.location_id.eq(&other.id.location_id)
59    }
60}
61
62pub trait TElement {
63    fn get_session(&self) -> Result<Box<dyn TSession>, SessionError>;
64
65    fn get_meta(&self) -> Result<String, SessionError>;
66    fn set_meta(&self, meta: &str) -> Result<(), SessionError>;
67
68    fn get_element_data(&self) -> Result<Data, SessionError>;
69    fn set_element_data(&self, data: Data) -> Result<(), SessionError>;
70
71    fn get_module_data(&self) -> Result<Data, SessionError>;
72    fn set_module_data(&self, data: Data) -> Result<(), SessionError>;
73
74    fn get_module(&self) -> Result<Option<MRef>, SessionError>;
75    fn set_module(&self, module: Option<ModuleId>) -> Result<(), SessionError>;
76
77    fn resolv_module(&self) -> Result<bool, SessionError>;
78    fn init(&self) -> Result<bool, SessionError>;
79
80    fn get_url(&self) -> Result<Option<String>, SessionError>;
81    fn set_url(&self, url: Option<String>) -> Result<(), SessionError>;
82
83    fn get_statuses(&self) -> Result<Vec<String>, SessionError>;
84    fn set_statuses(&self, statuses: Vec<String>) -> Result<(), SessionError>;
85
86    fn get_status(&self) -> Result<usize, SessionError>;
87    fn get_status_msg(&self) -> Result<String, SessionError>;
88    fn set_status(&self, status: usize) -> Result<(), SessionError>;
89
90    fn get_data(&self) -> Result<FileOrData, SessionError>;
91    fn set_data(&self, data: FileOrData) -> Result<(), SessionError>;
92
93    fn get_progress(&self) -> Result<f32, SessionError>;
94    fn set_progress(&self, progress: f32) -> Result<(), SessionError>;
95
96    fn get_should_save(&self) -> Result<bool, SessionError>;
97    fn set_should_save(&self, should_save: bool) -> Result<(), SessionError>;
98
99    fn is_enabled(&self) -> Result<bool, SessionError>;
100    fn set_enabled(&self, enabled: bool, storage: Option<Storage>) -> Result<(), SessionError>;
101
102    fn get_element_info(&self) -> Result<ElementInfo, SessionError>;
103
104    fn wait(&self) -> Result<(), SessionError>;
105
106    fn destroy(self) -> Result<ERow, SessionError>;
107
108    fn id(&self) -> ElementId;
109}
110
111pub struct Element {
112    pub name: String,
113    pub desc: String,
114    pub meta: String,
115    pub url: Option<String>,
116    pub element_data: Data,
117    pub module_data: Data,
118    pub module: Option<MRef>,
119    pub statuses: Vec<String>,
120    pub status: usize,
121    pub data: FileOrData,
122    pub progress: f32,
123    pub should_save: bool,
124    pub enabled: bool,
125    pub thread: Option<JoinHandle<()>>,
126    pub events: Arc<RwLock<Events>>,
127    pub info: ERef,
128}
129
130unsafe impl Sync for Element {}
131unsafe impl Send for Element {}
132
133pub trait TRowElement {
134    fn set_status(&self, status: usize);
135}
136
137impl TRowElement for ERow {
138    fn set_status(&self, status: usize) {
139        {
140            let mut element = self.write().unwrap();
141            element.status = status;
142        }
143    }
144}
145
146impl Debug for Element {
147    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
148        f.debug_struct("RowElement")
149            .field("name", &self.name)
150            .field("desc", &self.desc)
151            .field("meta", &self.meta)
152            .field("element_data", &self.element_data)
153            .field("module_data", &self.module_data)
154            .field("statuses", &self.statuses)
155            .field("data", &self.data)
156            .field("progress", &self.progress)
157            .field("should_save", &self.should_save)
158            .field("enable", &self.enabled)
159            .field("thread", &self.thread)
160            .finish()
161    }
162}
163
164impl TElement for ERef {
165    fn get_session(&self) -> Result<Box<dyn TSession>, SessionError> {
166        if let Some(session) = &self.read().unwrap().session {
167            return Ok(session.c());
168        }
169        Err(SessionError::InvalidSession)
170    }
171
172    fn get_meta(&self) -> Result<String, SessionError> {
173        self.get_session()?.element_get_meta(&self.id())
174    }
175
176    fn set_meta(&self, meta: &str) -> Result<(), SessionError> {
177        self.get_session()?.element_set_meta(&self.id(), meta)
178    }
179
180    fn get_element_data(&self) -> Result<Data, SessionError> {
181        self.get_session()?.element_get_element_data(&self.id())
182    }
183
184    fn set_element_data(&self, data: Data) -> Result<(), SessionError> {
185        self.get_session()?
186            .element_set_element_data(&self.id(), data)
187    }
188
189    fn get_module_data(&self) -> Result<Data, SessionError> {
190        self.get_session()?.element_get_module_data(&self.id())
191    }
192
193    fn set_module_data(&self, data: Data) -> Result<(), SessionError> {
194        self.get_session()?
195            .element_set_module_data(&self.id(), data)
196    }
197
198    fn get_module(&self) -> Result<Option<MRef>, SessionError> {
199        self.get_session()?.element_get_module(&self.id())
200    }
201
202    fn set_module(&self, module: Option<ModuleId>) -> Result<(), SessionError> {
203        self.get_session()?.element_set_module(&self.id(), module)
204    }
205
206    fn resolv_module(&self) -> Result<bool, SessionError> {
207        self.get_session()?.element_resolv_module(&self.id())
208    }
209
210    fn init(&self) -> Result<bool, SessionError> {
211        if let Some(module) = &self.get_module()? {
212            self.get_session()?
213                .module_init_element(&module.id(), &self.id())?;
214            Ok(true)
215        } else {
216            Ok(false)
217        }
218    }
219
220    fn get_statuses(&self) -> Result<Vec<String>, SessionError> {
221        self.get_session()?.element_get_statuses(&self.id())
222    }
223
224    fn set_statuses(&self, statuses: Vec<String>) -> Result<(), SessionError> {
225        self.get_session()?
226            .element_set_statuses(&self.id(), statuses)
227    }
228
229    fn get_status(&self) -> Result<usize, SessionError> {
230        self.get_session()?.element_get_status(&self.id())
231    }
232
233    fn get_status_msg(&self) -> Result<String, SessionError> {
234        if let Some(status) = self.get_statuses()?.get(self.get_status()?) {
235            Ok(status.clone())
236        } else {
237            Ok(String::from("None"))
238        }
239    }
240
241    fn set_status(&self, status: usize) -> Result<(), SessionError> {
242        self.get_session()?.element_set_status(&self.id(), status)
243    }
244
245    fn get_data(&self) -> Result<FileOrData, SessionError> {
246        self.get_session()?.element_get_data(&self.id())
247    }
248
249    fn set_data(&self, data: FileOrData) -> Result<(), SessionError> {
250        self.get_session()?.element_set_data(&self.id(), data)
251    }
252
253    fn get_progress(&self) -> Result<f32, SessionError> {
254        self.get_session()?.element_get_progress(&self.id())
255    }
256
257    fn set_progress(&self, progress: f32) -> Result<(), SessionError> {
258        self.get_session()?
259            .element_set_progress(&self.id(), progress)
260    }
261
262    fn get_should_save(&self) -> Result<bool, SessionError> {
263        self.get_session()?.element_get_should_save(&self.id())
264    }
265
266    fn set_should_save(&self, should_save: bool) -> Result<(), SessionError> {
267        self.get_session()?
268            .element_set_should_save(&self.id(), should_save)
269    }
270
271    fn is_enabled(&self) -> Result<bool, SessionError> {
272        self.get_session()?.element_get_enabled(&self.id())
273    }
274
275    fn set_enabled(&self, enabled: bool, storage: Option<Storage>) -> Result<(), SessionError> {
276        self.get_session()?
277            .element_set_enabled(&self.id(), enabled, storage)
278    }
279
280    fn get_element_info(&self) -> Result<ElementInfo, SessionError> {
281        self.get_session()?.element_get_element_info(&self.id())
282    }
283
284    fn wait(&self) -> Result<(), SessionError> {
285        self.get_session()?.element_wait(&self.id())
286    }
287
288    fn destroy(self) -> Result<ERow, SessionError> {
289        self.get_session()?.destroy_element(self.id())
290    }
291
292    fn id(&self) -> ElementId {
293        self.read().unwrap().id.clone()
294    }
295
296    fn get_url(&self) -> Result<Option<String>, SessionError> {
297        self.get_session()?.element_get_url(&self.id())
298    }
299
300    fn set_url(&self, url: Option<String>) -> Result<(), SessionError> {
301        self.get_session()?.element_set_url(&self.id(), url)
302    }
303}
304
305impl Common for ERef {
306    fn get_name(&self) -> Result<String, SessionError> {
307        self.get_session()?.element_get_name(&self.id())
308    }
309
310    fn set_name(&self, name: impl Into<String>) -> Result<(), SessionError> {
311        self.get_session()?
312            .element_set_name(&self.id(), &name.into())
313    }
314
315    fn get_desc(&self) -> Result<String, SessionError> {
316        self.get_session()?.element_get_desc(&self.id())
317    }
318
319    fn set_desc(&self, desc: impl Into<String>) -> Result<(), SessionError> {
320        self.get_session()?
321            .element_set_desc(&self.id(), &desc.into())
322    }
323
324    fn notify(&self, event: Event) -> Result<(), SessionError> {
325        self.get_session()?.element_notify(&self.id(), event)
326    }
327
328    fn emit(&self, event: Event) -> Result<(), SessionError> {
329        self.get_session()?.element_emit(&self.id(), event)
330    }
331
332    fn subscribe(&self, _ref: ID) -> Result<(), SessionError> {
333        self.get_session()?.element_subscribe(&self.id(), _ref)
334    }
335
336    fn unsubscribe(&self, _ref: ID) -> Result<(), SessionError> {
337        self.get_session()?.element_unsubscribe(&self.id(), _ref)
338    }
339}
340
341#[derive(Debug, Clone, Serialize, Deserialize, bytes_kman::Bytes)]
342pub struct ElementInfo {
343    pub name: String,
344    pub desc: String,
345    pub meta: String,
346    pub element_data: Data,
347    pub module_data: Data,
348    pub module: Option<ModuleInfo>,
349    pub statuses: Vec<String>,
350    pub status: usize,
351    pub data: FileOrData,
352    pub progress: f32,
353    pub should_save: bool,
354    pub enabled: bool,
355    pub id: ElementId,
356}
357
358impl Hash for ElementInfo {
359    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
360        self.name.hash(state);
361        self.desc.hash(state);
362        self.meta.hash(state);
363        self.element_data.hash(state);
364        self.module_data.hash(state);
365        self.statuses.hash(state);
366        self.status.hash(state);
367        self.data.hash(state);
368        self.enabled.hash(state);
369        (self.progress as i32).hash(state)
370    }
371}
372
373impl TGetLogger for ERef {
374    fn get_logger(&self, dst: Option<Arc<std::sync::Mutex<std::fs::File>>>) -> Logger {
375        Logger::for_element(dst, self.clone())
376    }
377}
378
379impl TGetLogger for ERow {
380    fn get_logger(&self, dst: Option<Arc<std::sync::Mutex<std::fs::File>>>) -> Logger {
381        let info = self.read().unwrap().info.clone();
382        Logger::for_element(dst, info)
383    }
384}