hit_data/index/
index_entry.rs

1use crate::events::{FieldListenerRef, Listeners};
2use crate::object_data::Id;
3use crate::object_data::ObjectValue;
4use crate::object_data::ObjectValues;
5use crate::HitError;
6use serde::{Deserialize, Serialize};
7use std::cell::RefCell;
8use std::default::Default;
9use std::rc::Rc;
10
11pub type IndexEntryRef = Rc<RefCell<IndexEntry>>;
12
13#[derive(Serialize, Deserialize, Default, Clone, PartialEq, Debug)]
14pub struct IndexEntryProperty {
15    pub id: Id,
16    pub property: String,
17}
18
19pub struct IndexEntry {
20    id: Id,
21    pub(in crate) data: ObjectValues,
22    parent: Option<IndexEntryProperty>,
23    pub(in crate) references: Vec<IndexEntryProperty>,
24    property_change_listeners: Listeners<ObjectValue>,
25}
26
27impl IndexEntry {
28    pub fn new(id: Id, data: ObjectValues, parent: Option<IndexEntryProperty>) -> IndexEntryRef {
29        return Rc::new(RefCell::new(IndexEntry {
30            id: String::from(id),
31            data: data,
32            parent: parent,
33            references: vec![],
34            property_change_listeners: Listeners::new(),
35        }));
36    }
37
38    pub(crate) fn new_raw(id: Id, data: ObjectValues, parent: Option<IndexEntryProperty>, references: Vec<IndexEntryProperty>) -> IndexEntryRef {
39        return Rc::new(RefCell::new(IndexEntry {
40            id: String::from(id),
41            data: data,
42            parent,
43            references,
44            property_change_listeners: Listeners::new(),
45        }));
46    }
47
48    pub fn get(&self, property: &str) -> &ObjectValue {
49        match self.data.get(property) {
50            Some(data) => data,
51            None => &ObjectValue::Null,
52        }
53    }
54
55    pub fn get_parent(&self) -> Option<IndexEntryProperty> {
56        return self.parent.clone();
57    }
58
59    pub(in crate) fn set_parent(&mut self, parent: Option<IndexEntryProperty>) {
60        self.parent = parent;
61    }
62
63    pub fn get_parent_id(&self) -> Option<Id> {
64        let id = &self.parent.as_ref()?.id;
65        return Some(String::from(id));
66    }
67    pub fn get_parent_property(&self) -> Option<String> {
68        let property = &self.parent.as_ref()?.property;
69        return Some(String::from(property));
70    }
71
72    pub fn get_id(&self) -> &Id {
73        &self.id
74    }
75
76    pub(in crate::index) fn set(
77        &mut self,
78        property: &str,
79        value: ObjectValue,
80    ) -> Result<(), HitError> {
81        self.data.insert(property.to_string(), value.clone());
82        self.dispatch_value(property, value);
83        Ok(())
84    }
85
86    pub(in crate::index) fn dispatch_value(&mut self, property: &str, value: ObjectValue) {
87        self.property_change_listeners
88            .dispatch_value(&property, &value.clone());
89    }
90
91    pub fn add_listener(&mut self, property: &str, listener: FieldListenerRef<ObjectValue>) {
92        self.property_change_listeners.insert(property, listener);
93    }
94
95    pub fn remove_listener(&mut self, property: &str, listener_id: &str) -> Result<(), HitError> {
96        self.property_change_listeners.remove(property, listener_id)
97    }
98}