From e898d4d7ee237b8ac845be9bd0694326d5bc5d3f Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Wed, 28 Apr 2021 16:09:55 -0600 Subject: [PATCH] add clone --- patch-db-macro-internals/src/lib.rs | 14 ++++++-- patch-db/src/model.rs | 54 +++++++++++++++++++++++++---- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/patch-db-macro-internals/src/lib.rs b/patch-db-macro-internals/src/lib.rs index b94a807..5dad4d2 100644 --- a/patch-db-macro-internals/src/lib.rs +++ b/patch-db-macro-internals/src/lib.rs @@ -149,8 +149,13 @@ fn build_model_struct( syn::parse2(quote! { patch_db::Model::<#ty> }).unwrap() }; return quote! { - #[derive(Debug, Clone)] + #[derive(Debug)] #model_vis struct #model_name(#inner_model); + impl std::clone::Clone for #model_name { + fn clone(&self) -> Self { + #model_name(self.0.clone()) + } + } impl core::ops::Deref for #model_name { type Target = #inner_model; fn deref(&self) -> &Self::Target { @@ -227,8 +232,13 @@ fn build_model_struct( Fields::Unit => (), } quote! { - #[derive(Debug, Clone)] + #[derive(Debug)] #model_vis struct #model_name(patch_db::Model<#base_name>); + impl std::clone::Clone for #model_name { + fn clone(&self) -> Self { + #model_name(self.0.clone()) + } + } impl core::ops::Deref for #model_name { type Target = patch_db::Model<#base_name>; fn deref(&self) -> &Self::Target { diff --git a/patch-db/src/model.rs b/patch-db/src/model.rs index 310e415..083b039 100644 --- a/patch-db/src/model.rs +++ b/patch-db/src/model.rs @@ -60,7 +60,7 @@ where } pub async fn get(&self, db: &mut Db) -> Result, Error> { - db.lock(&self.ptr, LockType::Read).await; + self.lock(db, LockType::Read).await; Ok(ModelData(db.get(&self.ptr).await?)) } @@ -133,10 +133,14 @@ where } pub trait HasModel: Serialize + for<'de> Deserialize<'de> { - type Model: From + AsRef + Into + From>; + type Model: From + + AsRef + + Into + + From> + + Clone; } -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct BoxModel Deserialize<'de>>(T::Model); impl Deserialize<'de>> Deref for BoxModel { type Target = T::Model; @@ -167,11 +171,19 @@ impl Deserialize<'de>> From> for model.0.into() } } +impl std::clone::Clone for BoxModel +where + T: HasModel + Serialize + for<'de> Deserialize<'de>, +{ + fn clone(&self) -> Self { + BoxModel(self.0.clone()) + } +} impl Deserialize<'de>> HasModel for Box { type Model = BoxModel; } -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct OptionModel Deserialize<'de>>(T::Model); impl Deserialize<'de>> OptionModel { pub async fn exists(&self, db: &mut Db) -> Result { @@ -223,11 +235,19 @@ impl Deserialize<'de>> AsRef for self.0.as_ref() } } +impl std::clone::Clone for OptionModel +where + T: HasModel + Serialize + for<'de> Deserialize<'de>, +{ + fn clone(&self) -> Self { + OptionModel(self.0.clone()) + } +} impl Deserialize<'de>> HasModel for Option { type Model = OptionModel; } -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct VecModel Deserialize<'de>>(Model>); impl Deserialize<'de>> Deref for VecModel { type Target = Model>; @@ -240,6 +260,11 @@ impl Deserialize<'de>> VecModel { self.child(&format!("{}", idx)) } } +impl Deserialize<'de>> VecModel { + pub fn idx_model(&self, idx: usize) -> OptionModel { + self.child(&format!("{}", idx)).into() + } +} impl Deserialize<'de>> From>> for VecModel { fn from(model: Model>) -> Self { VecModel(From::from(JsonPointer::from(model))) @@ -263,6 +288,14 @@ where self.0.as_ref() } } +impl std::clone::Clone for VecModel +where + T: Serialize + for<'de> Deserialize<'de>, +{ + fn clone(&self) -> Self { + VecModel(self.0.clone()) + } +} impl Deserialize<'de>> HasModel for Vec { type Model = VecModel; } @@ -288,7 +321,7 @@ impl + Ord, V> Map for BTreeMap { } } -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct MapModel(Model) where T: Serialize + for<'de> Deserialize<'de> + Map, @@ -303,6 +336,15 @@ where &self.0 } } +impl std::clone::Clone for MapModel +where + T: Serialize + for<'de> Deserialize<'de> + Map, + T::Value: Serialize + for<'de> Deserialize<'de>, +{ + fn clone(&self) -> Self { + MapModel(self.0.clone()) + } +} impl MapModel where T: Serialize + for<'de> Deserialize<'de> + Map,