1use std::{
2 collections::HashMap,
3 fmt::{Debug, Display},
4 hash::Hash,
5 path::PathBuf,
6 sync::{Arc, RwLock},
7};
8
9use bytes_kman::TBytes;
10
11pub type LRef = Arc<RwLock<RefLocation>>;
12pub type ERef = Arc<RwLock<RefElement>>;
13pub type MRef = Arc<RwLock<RefModule>>;
14
15pub type LRow = Arc<RwLock<Location>>;
16pub type ERow = Arc<RwLock<Element>>;
17pub type MRow = Arc<RwLock<Module>>;
18
19#[derive(Debug, Clone, bytes_kman::Bytes)]
20pub enum ID {
21 Element(ElementId),
22 Location(LocationId),
23}
24
25impl PartialEq for ID {
26 fn eq(&self, other: &Self) -> bool {
27 match self {
28 ID::Element(e) => {
29 if let ID::Element(se) = other {
30 e == se
31 } else {
32 false
33 }
34 }
35 ID::Location(l) => {
36 if let ID::Location(sl) = other {
37 l == sl
38 } else {
39 false
40 }
41 }
42 }
43 }
44}
45
46impl ID {
47 pub fn get_ref(&self, session: &dyn TSession) -> Result<Ref, SessionError> {
48 match self {
49 ID::Element(e) => Ok(Ref::Element(session.get_element_ref(e)?)),
50 ID::Location(l) => Ok(Ref::Location(session.get_location_ref(l)?)),
51 }
52 }
53}
54
55use serde::{Deserialize, Serialize};
56
57use crate::{
58 element::ElementId,
59 enums::{AdvanceEnum, CustomEnum},
60 prelude::{
61 Element, FileOrData, Location, LocationId, Module, Ref, RefElement, RefLocation, RefModule,
62 SessionError, TSession,
63 },
64};
65
66#[derive(Debug, Clone, Serialize, Deserialize, bytes_kman::Bytes)]
67pub enum Type {
68 U8(u8),
69 U16(u16),
70 U32(u32),
71 U64(u64),
72 U128(u128),
73 USize(usize),
74
75 I8(i8),
76 I16(i16),
77 I32(i32),
78 I64(i64),
79 I128(i128),
80 ISize(isize),
81
82 F32(f32),
83 F64(f64),
84
85 Bool(bool),
86
87 String(String),
88 Path(PathBuf),
89 HashMapSS(HashMap<String, String>),
90 HashMapS(HashMap<String, Type>),
91 FileOrData(FileOrData),
93 CustomEnum(CustomEnum),
94 AdvancedEnum(AdvanceEnum),
95 Vec(Vec<Type>),
97 Bytes(Vec<u8>),
98
99 None,
100}
101
102impl Hash for Type {
103 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
104 match self {
105 Type::U8(i) => i.hash(state),
106 Type::U16(i) => i.hash(state),
107 Type::U32(i) => i.hash(state),
108 Type::U64(i) => i.hash(state),
109 Type::U128(i) => i.hash(state),
110 Type::USize(i) => i.hash(state),
111 Type::I8(i) => i.hash(state),
112 Type::I16(i) => i.hash(state),
113 Type::I32(i) => i.hash(state),
114 Type::I64(i) => i.hash(state),
115 Type::I128(i) => i.hash(state),
116 Type::ISize(i) => i.hash(state),
117 Type::F32(f) => (*f as i32).hash(state),
118 Type::F64(f) => (*f as i64).hash(state),
119 Type::Bool(b) => b.hash(state),
120 Type::String(s) => s.hash(state),
121 Type::Path(p) => p.hash(state),
122 Type::HashMapSS(h) => {
123 for (k, e) in h.iter() {
124 k.hash(state);
125 e.hash(state)
126 }
127 }
128 Type::HashMapS(h) => {
129 for k in h.keys() {
130 k.hash(state)
131 }
132 }
133 Type::FileOrData(ford) => ford.hash(state),
134 Type::CustomEnum(e) => e.hash(state),
135 Type::AdvancedEnum(e) => e.hash(state),
136 Type::Vec(v) => v.hash(state),
137 Type::Bytes(b) => b.hash(state),
138 Type::None => 0.hash(state),
139 }
140 }
141}
142
143impl Type {
144 pub fn to_tag(&self) -> TypeTag {
145 use TypeTag::*;
146
147 match self {
148 Type::U8(_) => U8,
149 Type::U16(_) => U16,
150 Type::U32(_) => U32,
151 Type::U64(_) => U64,
152 Type::U128(_) => U128,
153 Type::USize(_) => USize,
154 Type::I8(_) => I8,
155 Type::I16(_) => I16,
156 Type::I32(_) => I32,
157 Type::I64(_) => I64,
158 Type::I128(_) => I128,
159 Type::ISize(_) => ISize,
160 Type::F32(_) => F32,
161 Type::F64(_) => F64,
162 Type::Bool(_) => Bool,
163 Type::String(_) => String,
164 Type::Path(_) => Path,
165 Type::HashMapSS(_) => HashMapSS,
166 Type::HashMapS(h) => {
167 let Some(ty) = h.iter().next() else{return None;};
168 HashMapS(Box::new(ty.1.to_tag()))
169 }
170 Type::FileOrData(_) => FileOrData,
171 Type::CustomEnum(e) => CustomEnum(e.clone()),
172 Type::AdvancedEnum(e) => AdvancedEnum(e.clone()),
173 Type::Vec(v) => {
174 let Some(d) = v.get(0)else{return Vec(Box::new(None))};
175 Vec(Box::new(d.to_tag()))
176 }
177 Type::Bytes(_) => Bytes,
178 Type::None => None,
179 }
180 }
181}
182
183impl Display for Type {
184 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
185 match self {
186 Type::U8(v) => (v as &dyn Display).fmt(f),
187 Type::U16(v) => (v as &dyn Display).fmt(f),
188 Type::U32(v) => (v as &dyn Display).fmt(f),
189 Type::U64(v) => (v as &dyn Display).fmt(f),
190 Type::U128(v) => (v as &dyn Display).fmt(f),
191 Type::USize(v) => (v as &dyn Display).fmt(f),
192 Type::I8(v) => (v as &dyn Display).fmt(f),
193 Type::I16(v) => (v as &dyn Display).fmt(f),
194 Type::I32(v) => (v as &dyn Display).fmt(f),
195 Type::I64(v) => (v as &dyn Display).fmt(f),
196 Type::I128(v) => (v as &dyn Display).fmt(f),
197 Type::ISize(v) => (v as &dyn Display).fmt(f),
198 Type::F32(v) => (v as &dyn Display).fmt(f),
199 Type::F64(v) => (v as &dyn Display).fmt(f),
200 Type::Bool(v) => (v as &dyn Display).fmt(f),
201 Type::String(s) => f.write_str(s),
202 Type::Path(v) => f.write_str(if let Some(str) = v.to_str() {
203 str
204 } else {
205 "Cannot parse!"
206 }),
207 Type::HashMapSS(v) => {
208 let mut buff = String::new();
209 for (k, v) in v.iter() {
210 buff.push_str(&format!("{k}: {v}"));
211 }
212 f.write_str(&buff)
213 }
214 Type::HashMapS(v) => {
215 let mut buff = String::new();
216 for (k, v) in v.iter() {
217 buff.push_str(&format!("{k}: {v}"));
218 }
219 f.write_str(&buff)
220 }
221 Type::FileOrData(ford) => match ford {
222 FileOrData::File(file_path, _) => write!(
223 f,
224 "File: {}",
225 if let Some(path) = file_path.to_str() {
226 path
227 } else {
228 "Cannot parse path!"
229 }
230 ),
231 FileOrData::Bytes(b) => b.fmt(f),
232 },
233 Type::CustomEnum(e) => {
234 if let Some(e) = e.get_active() {
235 f.write_str(&e)
236 } else {
237 f.write_str("None")
238 }
239 }
240 Type::AdvancedEnum(_) => {
241 f.write_str("Not Implemented")
242 }
248 Type::Vec(v) => v.fmt(f),
249 Type::Bytes(b) => (b as &dyn std::fmt::Debug).fmt(f),
250 Type::None => f.write_str(""),
251 }
252 }
253}
254
255impl From<u8> for Type {
256 fn from(value: u8) -> Self {
257 Self::U8(value)
258 }
259}
260
261impl From<u16> for Type {
262 fn from(value: u16) -> Self {
263 Self::U16(value)
264 }
265}
266
267impl From<u32> for Type {
268 fn from(value: u32) -> Self {
269 Self::U32(value)
270 }
271}
272
273impl From<u64> for Type {
274 fn from(value: u64) -> Self {
275 Self::U64(value)
276 }
277}
278
279impl From<u128> for Type {
280 fn from(value: u128) -> Self {
281 Self::U128(value)
282 }
283}
284
285impl From<usize> for Type {
286 fn from(value: usize) -> Self {
287 Self::USize(value)
288 }
289}
290
291impl From<i8> for Type {
292 fn from(value: i8) -> Self {
293 Self::I8(value)
294 }
295}
296
297impl From<i16> for Type {
298 fn from(value: i16) -> Self {
299 Self::I16(value)
300 }
301}
302
303impl From<i32> for Type {
304 fn from(value: i32) -> Self {
305 Self::I32(value)
306 }
307}
308
309impl From<i64> for Type {
310 fn from(value: i64) -> Self {
311 Self::I64(value)
312 }
313}
314
315impl From<i128> for Type {
316 fn from(value: i128) -> Self {
317 Self::I128(value)
318 }
319}
320
321impl From<isize> for Type {
322 fn from(value: isize) -> Self {
323 Self::ISize(value)
324 }
325}
326
327impl From<f32> for Type {
328 fn from(value: f32) -> Self {
329 Self::F32(value)
330 }
331}
332
333impl From<f64> for Type {
334 fn from(value: f64) -> Self {
335 Self::F64(value)
336 }
337}
338
339impl From<bool> for Type {
340 fn from(value: bool) -> Self {
341 Self::Bool(value)
342 }
343}
344
345impl From<String> for Type {
346 fn from(value: String) -> Self {
347 Self::String(value)
348 }
349}
350
351impl From<&str> for Type {
352 fn from(value: &str) -> Self {
353 Self::String(value.into())
354 }
355}
356
357impl TryInto<u8> for Type {
358 type Error = ();
359
360 fn try_into(self) -> Result<u8, Self::Error> {
361 if let Self::U8(value) = self {
362 Ok(value)
363 } else {
364 Err(())
365 }
366 }
367}
368
369impl TryInto<u16> for Type {
370 type Error = ();
371
372 fn try_into(self) -> Result<u16, Self::Error> {
373 if let Self::U16(value) = self {
374 Ok(value)
375 } else {
376 Err(())
377 }
378 }
379}
380
381impl TryInto<u32> for Type {
382 type Error = ();
383
384 fn try_into(self) -> Result<u32, Self::Error> {
385 if let Self::U32(value) = self {
386 Ok(value)
387 } else {
388 Err(())
389 }
390 }
391}
392
393impl TryInto<u64> for Type {
394 type Error = ();
395
396 fn try_into(self) -> Result<u64, Self::Error> {
397 if let Self::U64(value) = self {
398 Ok(value)
399 } else {
400 Err(())
401 }
402 }
403}
404
405impl TryInto<u128> for Type {
406 type Error = ();
407
408 fn try_into(self) -> Result<u128, Self::Error> {
409 if let Self::U128(value) = self {
410 Ok(value)
411 } else {
412 Err(())
413 }
414 }
415}
416
417impl TryInto<usize> for Type {
418 type Error = ();
419
420 fn try_into(self) -> Result<usize, Self::Error> {
421 if let Self::USize(value) = self {
422 Ok(value)
423 } else {
424 Err(())
425 }
426 }
427}
428
429impl TryInto<i8> for Type {
430 type Error = ();
431
432 fn try_into(self) -> Result<i8, Self::Error> {
433 if let Self::I8(value) = self {
434 Ok(value)
435 } else {
436 Err(())
437 }
438 }
439}
440
441impl TryInto<i16> for Type {
442 type Error = ();
443
444 fn try_into(self) -> Result<i16, Self::Error> {
445 if let Self::I16(value) = self {
446 Ok(value)
447 } else {
448 Err(())
449 }
450 }
451}
452
453impl TryInto<i32> for Type {
454 type Error = ();
455
456 fn try_into(self) -> Result<i32, Self::Error> {
457 if let Self::I32(value) = self {
458 Ok(value)
459 } else {
460 Err(())
461 }
462 }
463}
464
465impl TryInto<i64> for Type {
466 type Error = ();
467
468 fn try_into(self) -> Result<i64, Self::Error> {
469 if let Self::I64(value) = self {
470 Ok(value)
471 } else {
472 Err(())
473 }
474 }
475}
476
477impl TryInto<i128> for Type {
478 type Error = ();
479
480 fn try_into(self) -> Result<i128, Self::Error> {
481 if let Self::I128(value) = self {
482 Ok(value)
483 } else {
484 Err(())
485 }
486 }
487}
488
489impl TryInto<isize> for Type {
490 type Error = ();
491
492 fn try_into(self) -> Result<isize, Self::Error> {
493 if let Self::ISize(value) = self {
494 Ok(value)
495 } else {
496 Err(())
497 }
498 }
499}
500
501impl TryInto<f32> for Type {
502 type Error = ();
503
504 fn try_into(self) -> Result<f32, Self::Error> {
505 if let Self::F32(value) = self {
506 Ok(value)
507 } else {
508 Err(())
509 }
510 }
511}
512
513impl TryInto<f64> for Type {
514 type Error = ();
515
516 fn try_into(self) -> Result<f64, Self::Error> {
517 if let Self::F64(value) = self {
518 Ok(value)
519 } else {
520 Err(())
521 }
522 }
523}
524
525impl TryInto<bool> for Type {
526 type Error = ();
527
528 fn try_into(self) -> Result<bool, Self::Error> {
529 if let Self::Bool(value) = self {
530 Ok(value)
531 } else {
532 Err(())
533 }
534 }
535}
536
537impl TryInto<String> for Type {
538 type Error = ();
539
540 fn try_into(self) -> Result<String, Self::Error> {
541 if let Self::String(value) = self {
542 Ok(value)
543 } else {
544 Err(())
545 }
546 }
547}
548
549#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Hash, bytes_kman::Bytes)]
550pub enum TypeTag {
551 U8,
552 U16,
553 U32,
554 U64,
555 U128,
556 USize,
557
558 I8,
559 I16,
560 I32,
561 I64,
562 I128,
563 ISize,
564
565 F32,
566 F64,
567
568 Bool,
569
570 String,
571 Url,
572 Path,
573 HashMapSS,
574 HashMapS(Box<TypeTag>),
575 FileOrData,
576
577 Any,
578
579 CustomEnum(CustomEnum),
580 AdvancedEnum(AdvanceEnum),
581
582 Vec(Box<TypeTag>),
583 Bytes,
584
585 None,
586}
587
588impl Display for TypeTag {
589 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
590 f.write_str(match self {
591 TypeTag::U8 => "u8",
592 TypeTag::U16 => "u16",
593 TypeTag::U32 => "u32",
594 TypeTag::U64 => "u64",
595 TypeTag::U128 => "u128",
596 TypeTag::USize => "usize",
597 TypeTag::I8 => "i8",
598 TypeTag::I16 => "i16",
599 TypeTag::I32 => "i32",
600 TypeTag::I64 => "i64",
601 TypeTag::I128 => "i128",
602 TypeTag::ISize => "isize",
603 TypeTag::F32 => "f32",
604 TypeTag::F64 => "f64",
605 TypeTag::Bool => "bool",
606 TypeTag::String => "string",
607 TypeTag::Url => "url",
608 TypeTag::Path => "path",
609 TypeTag::HashMapSS => "hashmap_string_string",
610 TypeTag::HashMapS(h) => return write!(f, "hashmap_string({h})"),
611 TypeTag::FileOrData => "file_or_data",
612 TypeTag::Any => "any",
613 TypeTag::CustomEnum(_) => "custom_enum",
614 TypeTag::AdvancedEnum(_) => "advanced_enum",
615 TypeTag::Vec(v) => return write!(f, "vec({v})"),
616 TypeTag::Bytes => "bytes",
617 TypeTag::None => "none",
618 })
619 }
620}
621
622#[derive(Debug, Clone, Serialize, Deserialize, Hash, bytes_kman::Bytes)]
623pub enum TypeValidation {
624 Range(usize, usize),
625}