add clone

This commit is contained in:
Aiden McClelland
2021-04-28 16:09:55 -06:00
committed by Aiden McClelland
parent b70f1ce3af
commit e898d4d7ee
2 changed files with 60 additions and 8 deletions

View File

@@ -149,8 +149,13 @@ fn build_model_struct(
syn::parse2(quote! { patch_db::Model::<#ty> }).unwrap() syn::parse2(quote! { patch_db::Model::<#ty> }).unwrap()
}; };
return quote! { return quote! {
#[derive(Debug, Clone)] #[derive(Debug)]
#model_vis struct #model_name(#inner_model); #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 { impl core::ops::Deref for #model_name {
type Target = #inner_model; type Target = #inner_model;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
@@ -227,8 +232,13 @@ fn build_model_struct(
Fields::Unit => (), Fields::Unit => (),
} }
quote! { quote! {
#[derive(Debug, Clone)] #[derive(Debug)]
#model_vis struct #model_name(patch_db::Model<#base_name>); #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 { impl core::ops::Deref for #model_name {
type Target = patch_db::Model<#base_name>; type Target = patch_db::Model<#base_name>;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {

View File

@@ -60,7 +60,7 @@ where
} }
pub async fn get<Db: DbHandle>(&self, db: &mut Db) -> Result<ModelData<T>, Error> { pub async fn get<Db: DbHandle>(&self, db: &mut Db) -> Result<ModelData<T>, Error> {
db.lock(&self.ptr, LockType::Read).await; self.lock(db, LockType::Read).await;
Ok(ModelData(db.get(&self.ptr).await?)) Ok(ModelData(db.get(&self.ptr).await?))
} }
@@ -133,10 +133,14 @@ where
} }
pub trait HasModel: Serialize + for<'de> Deserialize<'de> { pub trait HasModel: Serialize + for<'de> Deserialize<'de> {
type Model: From<JsonPointer> + AsRef<JsonPointer> + Into<JsonPointer> + From<Model<Self>>; type Model: From<JsonPointer>
+ AsRef<JsonPointer>
+ Into<JsonPointer>
+ From<Model<Self>>
+ Clone;
} }
#[derive(Debug, Clone)] #[derive(Debug)]
pub struct BoxModel<T: HasModel + Serialize + for<'de> Deserialize<'de>>(T::Model); pub struct BoxModel<T: HasModel + Serialize + for<'de> Deserialize<'de>>(T::Model);
impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> Deref for BoxModel<T> { impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> Deref for BoxModel<T> {
type Target = T::Model; type Target = T::Model;
@@ -167,11 +171,19 @@ impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> From<BoxModel<T>> for
model.0.into() model.0.into()
} }
} }
impl<T> std::clone::Clone for BoxModel<T>
where
T: HasModel + Serialize + for<'de> Deserialize<'de>,
{
fn clone(&self) -> Self {
BoxModel(self.0.clone())
}
}
impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> HasModel for Box<T> { impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> HasModel for Box<T> {
type Model = BoxModel<T>; type Model = BoxModel<T>;
} }
#[derive(Debug, Clone)] #[derive(Debug)]
pub struct OptionModel<T: HasModel + Serialize + for<'de> Deserialize<'de>>(T::Model); pub struct OptionModel<T: HasModel + Serialize + for<'de> Deserialize<'de>>(T::Model);
impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> OptionModel<T> { impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> OptionModel<T> {
pub async fn exists<Db: DbHandle>(&self, db: &mut Db) -> Result<bool, Error> { pub async fn exists<Db: DbHandle>(&self, db: &mut Db) -> Result<bool, Error> {
@@ -223,11 +235,19 @@ impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> AsRef<JsonPointer> for
self.0.as_ref() self.0.as_ref()
} }
} }
impl<T> std::clone::Clone for OptionModel<T>
where
T: HasModel + Serialize + for<'de> Deserialize<'de>,
{
fn clone(&self) -> Self {
OptionModel(self.0.clone())
}
}
impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> HasModel for Option<T> { impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> HasModel for Option<T> {
type Model = OptionModel<T>; type Model = OptionModel<T>;
} }
#[derive(Debug, Clone)] #[derive(Debug)]
pub struct VecModel<T: Serialize + for<'de> Deserialize<'de>>(Model<Vec<T>>); pub struct VecModel<T: Serialize + for<'de> Deserialize<'de>>(Model<Vec<T>>);
impl<T: Serialize + for<'de> Deserialize<'de>> Deref for VecModel<T> { impl<T: Serialize + for<'de> Deserialize<'de>> Deref for VecModel<T> {
type Target = Model<Vec<T>>; type Target = Model<Vec<T>>;
@@ -240,6 +260,11 @@ impl<T: Serialize + for<'de> Deserialize<'de>> VecModel<T> {
self.child(&format!("{}", idx)) self.child(&format!("{}", idx))
} }
} }
impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> VecModel<T> {
pub fn idx_model(&self, idx: usize) -> OptionModel<T> {
self.child(&format!("{}", idx)).into()
}
}
impl<T: Serialize + for<'de> Deserialize<'de>> From<Model<Vec<T>>> for VecModel<T> { impl<T: Serialize + for<'de> Deserialize<'de>> From<Model<Vec<T>>> for VecModel<T> {
fn from(model: Model<Vec<T>>) -> Self { fn from(model: Model<Vec<T>>) -> Self {
VecModel(From::from(JsonPointer::from(model))) VecModel(From::from(JsonPointer::from(model)))
@@ -263,6 +288,14 @@ where
self.0.as_ref() self.0.as_ref()
} }
} }
impl<T> std::clone::Clone for VecModel<T>
where
T: Serialize + for<'de> Deserialize<'de>,
{
fn clone(&self) -> Self {
VecModel(self.0.clone())
}
}
impl<T: Serialize + for<'de> Deserialize<'de>> HasModel for Vec<T> { impl<T: Serialize + for<'de> Deserialize<'de>> HasModel for Vec<T> {
type Model = VecModel<T>; type Model = VecModel<T>;
} }
@@ -288,7 +321,7 @@ impl<K: AsRef<str> + Ord, V> Map for BTreeMap<K, V> {
} }
} }
#[derive(Debug, Clone)] #[derive(Debug)]
pub struct MapModel<T>(Model<T>) pub struct MapModel<T>(Model<T>)
where where
T: Serialize + for<'de> Deserialize<'de> + Map, T: Serialize + for<'de> Deserialize<'de> + Map,
@@ -303,6 +336,15 @@ where
&self.0 &self.0
} }
} }
impl<T> std::clone::Clone for MapModel<T>
where
T: Serialize + for<'de> Deserialize<'de> + Map,
T::Value: Serialize + for<'de> Deserialize<'de>,
{
fn clone(&self) -> Self {
MapModel(self.0.clone())
}
}
impl<T> MapModel<T> impl<T> MapModel<T>
where where
T: Serialize + for<'de> Deserialize<'de> + Map, T: Serialize + for<'de> Deserialize<'de> + Map,