cache.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. use std::sync::Arc;
  2. use dashmap::DashMap;
  3. use crate::{
  4. errors::DocError,
  5. services::doc::{ClientEditDoc, DocId},
  6. };
  7. pub(crate) struct DocCache {
  8. inner: DashMap<DocId, Arc<ClientEditDoc>>,
  9. }
  10. impl DocCache {
  11. pub(crate) fn new() -> Self { Self { inner: DashMap::new() } }
  12. #[allow(dead_code)]
  13. pub(crate) fn all_docs(&self) -> Vec<Arc<ClientEditDoc>> {
  14. self.inner
  15. .iter()
  16. .map(|kv| kv.value().clone())
  17. .collect::<Vec<Arc<ClientEditDoc>>>()
  18. }
  19. pub(crate) fn set(&self, doc: Arc<ClientEditDoc>) {
  20. let doc_id = doc.doc_id.clone();
  21. if self.inner.contains_key(&doc_id) {
  22. log::warn!("Doc:{} already exists in cache", &doc_id);
  23. }
  24. self.inner.insert(doc_id, doc);
  25. }
  26. pub(crate) fn contains(&self, doc_id: &str) -> bool { self.inner.get(doc_id).is_some() }
  27. pub(crate) fn get(&self, doc_id: &str) -> Result<Arc<ClientEditDoc>, DocError> {
  28. if !self.contains(&doc_id) {
  29. return Err(doc_not_found());
  30. }
  31. let opened_doc = self.inner.get(doc_id).unwrap();
  32. Ok(opened_doc.clone())
  33. }
  34. pub(crate) fn remove(&self, id: &str) {
  35. let doc_id: DocId = id.into();
  36. self.inner.remove(&doc_id);
  37. }
  38. }
  39. fn doc_not_found() -> DocError { DocError::record_not_found().context("Doc is close or you should call open first") }