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}