From 209c9860c35823b6751ab7477e9d9e5773cefdcb Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Tue, 24 Aug 2021 15:18:49 -0600 Subject: [PATCH] MapModel remove --- patch-db/src/model.rs | 13 ++++++++++++- patch-db/src/patch.rs | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/patch-db/src/model.rs b/patch-db/src/model.rs index 3625571..007ad29 100644 --- a/patch-db/src/model.rs +++ b/patch-db/src/model.rs @@ -4,12 +4,13 @@ use std::marker::PhantomData; use std::ops::{Deref, DerefMut}; use indexmap::{IndexMap, IndexSet}; +use json_patch::{Patch, PatchOperation, RemoveOperation}; use json_ptr::JsonPointer; use serde::{Deserialize, Serialize}; use serde_json::Value; -use crate::Error; use crate::{locker::LockType, DbHandle}; +use crate::{DiffPatch, Error}; #[derive(Debug)] pub struct ModelData Deserialize<'de>>(T); @@ -459,6 +460,16 @@ where .map(|s| serde_json::from_value(Value::String(s))) .collect::>()?) } + pub async fn remove(&self, db: &mut Db, key: &T::Key) -> Result<(), Error> { + db.lock(self.as_ref(), LockType::Write, false).await; + db.apply(DiffPatch(Patch(vec![PatchOperation::Remove( + RemoveOperation { + path: self.as_ref().clone().join_end(key.as_ref()), + }, + )]))) + .await?; + Ok(()) + } } impl MapModel where diff --git a/patch-db/src/patch.rs b/patch-db/src/patch.rs index fdd44ba..f5561d5 100644 --- a/patch-db/src/patch.rs +++ b/patch-db/src/patch.rs @@ -22,7 +22,7 @@ pub struct Dump { } #[derive(Debug, Clone, Deserialize, Serialize)] -pub struct DiffPatch(Patch); +pub struct DiffPatch(pub(crate) Patch); impl DiffPatch { pub fn prepend, V: SegList>(&mut self, ptr: &JsonPointer) { self.0.prepend(ptr)