source2_demo/entity/
class.rs

1use crate::entity::field::Serializer;
2use crate::error::ClassError;
3use crate::HashMap;
4use std::rc::Rc;
5
6/// Container for classes.
7#[derive(Default)]
8pub struct Classes {
9    pub(crate) classes_vec: Vec<Rc<Class>>,
10    pub(crate) classes_by_name: HashMap<Box<str>, Rc<Class>>,
11    pub(crate) class_id_size: u32,
12}
13
14impl Classes {
15    pub(crate) fn get_by_id_rc(&self, id: usize) -> &Rc<Class> {
16        &self.classes_vec[id]
17    }
18
19    /// Iterator over all classes.
20    pub fn iter(&self) -> impl Iterator<Item = &Class> {
21        self.classes_vec.iter().map(|class| class.as_ref())
22    }
23
24    /// Returns [`Class`] for given id
25    pub fn get_by_id(&self, id: usize) -> Result<&Class, ClassError> {
26        self.classes_vec
27            .get(id)
28            .ok_or(ClassError::ClassNotFoundById(id as i32))
29            .map(|class| class.as_ref())
30    }
31
32    /// Returns [`Class`] for given name
33    pub fn get_by_name(&self, name: &str) -> Result<&Class, ClassError> {
34        self.classes_by_name
35            .get(name)
36            .ok_or_else(|| ClassError::ClassNotFoundByName(name.to_string()))
37            .map(|class| class.as_ref())
38    }
39}
40
41/// Entity class
42#[derive(Clone, Default)]
43pub struct Class {
44    pub(crate) id: i32,
45    pub(crate) name: Box<str>,
46    pub(crate) serializer: Rc<Serializer>,
47}
48
49impl Class {
50    pub(crate) fn new(id: i32, name: Box<str>, serializer: Rc<Serializer>) -> Self {
51        Class {
52            id,
53            name,
54            serializer,
55        }
56    }
57
58    /// Returns name of entity class \
59    /// `entity.class().name()`
60    pub fn name(&self) -> &str {
61        self.name.as_ref()
62    }
63
64    /// Returns id of entity class \
65    /// `entity.class().id()`
66    pub fn id(&self) -> i32 {
67        self.id
68    }
69}