grid_setting_rev.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. use crate::revision::{FieldRevision, FieldTypeRevision, FilterConfigurationRevision, GroupConfigurationRevision};
  2. use indexmap::IndexMap;
  3. use nanoid::nanoid;
  4. use serde::{Deserialize, Serialize};
  5. use std::collections::HashMap;
  6. use std::fmt::Debug;
  7. use std::sync::Arc;
  8. pub fn gen_grid_filter_id() -> String {
  9. nanoid!(6)
  10. }
  11. pub fn gen_grid_group_id() -> String {
  12. nanoid!(6)
  13. }
  14. #[allow(dead_code)]
  15. pub fn gen_grid_sort_id() -> String {
  16. nanoid!(6)
  17. }
  18. pub type FilterConfiguration = Configuration<FilterConfigurationRevision>;
  19. pub type FilterConfigurationsByFieldId = HashMap<String, Vec<Arc<FilterConfigurationRevision>>>;
  20. //
  21. pub type GroupConfiguration = Configuration<GroupConfigurationRevision>;
  22. pub type GroupConfigurationsByFieldId = HashMap<String, Vec<Arc<GroupConfigurationRevision>>>;
  23. #[derive(Debug, Clone, Serialize, Deserialize, Default)]
  24. #[serde(transparent)]
  25. pub struct Configuration<T>
  26. where
  27. T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
  28. {
  29. /// Key: field_id
  30. /// Value: this value contains key/value.
  31. /// Key: FieldType,
  32. /// Value: the corresponding objects.
  33. #[serde(with = "indexmap::serde_seq")]
  34. inner: IndexMap<String, ObjectIndexMap<T>>,
  35. }
  36. impl<T> Configuration<T>
  37. where
  38. T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
  39. {
  40. pub fn get_mut_objects(&mut self, field_id: &str, field_type: &FieldTypeRevision) -> Option<&mut Vec<Arc<T>>> {
  41. let value = self
  42. .inner
  43. .get_mut(field_id)
  44. .and_then(|object_rev_map| object_rev_map.get_mut(field_type));
  45. if value.is_none() {
  46. tracing::warn!("[Configuration] Can't find the {:?} with", std::any::type_name::<T>());
  47. }
  48. value
  49. }
  50. pub fn get_objects(&self, field_id: &str, field_type_rev: &FieldTypeRevision) -> Option<Vec<Arc<T>>> {
  51. self.inner
  52. .get(field_id)
  53. .and_then(|object_rev_map| object_rev_map.get(field_type_rev))
  54. .cloned()
  55. }
  56. pub fn get_objects_by_field_revs(&self, field_revs: &[Arc<FieldRevision>]) -> Option<HashMap<String, Vec<Arc<T>>>> {
  57. // Get the objects according to the FieldType, so we need iterate the field_revs.
  58. let objects_by_field_id = field_revs
  59. .iter()
  60. .flat_map(|field_rev| {
  61. let field_type = &field_rev.ty;
  62. let field_id = &field_rev.id;
  63. let object_rev_map = self.inner.get(field_id)?;
  64. let objects: Vec<Arc<T>> = object_rev_map.get(field_type)?.clone();
  65. Some((field_rev.id.clone(), objects))
  66. })
  67. .collect::<HashMap<String, Vec<Arc<T>>>>();
  68. Some(objects_by_field_id)
  69. }
  70. pub fn get_all_objects(&self) -> Vec<Arc<T>> {
  71. self.inner.values().map(|map| map.all_objects()).flatten().collect()
  72. }
  73. /// add object to the end of the list
  74. pub fn add_object(&mut self, field_id: &str, field_type: &FieldTypeRevision, object: T) {
  75. let object_rev_map = self
  76. .inner
  77. .entry(field_id.to_string())
  78. .or_insert_with(ObjectIndexMap::<T>::new);
  79. object_rev_map
  80. .entry(field_type.to_owned())
  81. .or_insert_with(Vec::new)
  82. .push(Arc::new(object))
  83. }
  84. pub fn clear(&mut self) {
  85. self.inner.clear()
  86. }
  87. }
  88. #[derive(Debug, Clone, Serialize, Deserialize, Default)]
  89. #[serde(transparent)]
  90. pub struct ObjectIndexMap<T>
  91. where
  92. T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
  93. {
  94. #[serde(with = "indexmap::serde_seq")]
  95. pub object_by_field_type: IndexMap<FieldTypeRevision, Vec<Arc<T>>>,
  96. }
  97. impl<T> ObjectIndexMap<T>
  98. where
  99. T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
  100. {
  101. pub fn new() -> Self {
  102. ObjectIndexMap::default()
  103. }
  104. pub fn all_objects(&self) -> Vec<Arc<T>> {
  105. self.object_by_field_type.values().cloned().flatten().collect()
  106. }
  107. }
  108. impl<T> std::ops::Deref for ObjectIndexMap<T>
  109. where
  110. T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
  111. {
  112. type Target = IndexMap<FieldTypeRevision, Vec<Arc<T>>>;
  113. fn deref(&self) -> &Self::Target {
  114. &self.object_by_field_type
  115. }
  116. }
  117. impl<T> std::ops::DerefMut for ObjectIndexMap<T>
  118. where
  119. T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
  120. {
  121. fn deref_mut(&mut self) -> &mut Self::Target {
  122. &mut self.object_by_field_type
  123. }
  124. }