hit_data/index/
index_entry.rs1use 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}