add clone

This commit is contained in:
Aiden McClelland
2021-04-28 16:09:55 -06:00
parent f1febb6bb4
commit a3040ddcf6
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()
};
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 {

View File

@@ -60,7 +60,7 @@ where
}
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?))
}
@@ -133,10 +133,14 @@ where
}
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);
impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> Deref for BoxModel<T> {
type Target = T::Model;
@@ -167,11 +171,19 @@ impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> From<BoxModel<T>> for
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> {
type Model = BoxModel<T>;
}
#[derive(Debug, Clone)]
#[derive(Debug)]
pub struct OptionModel<T: HasModel + Serialize + for<'de> Deserialize<'de>>(T::Model);
impl<T: HasModel + Serialize + for<'de> Deserialize<'de>> OptionModel<T> {
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()
}
}
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> {
type Model = OptionModel<T>;
}
#[derive(Debug, Clone)]
#[derive(Debug)]
pub struct VecModel<T: Serialize + for<'de> Deserialize<'de>>(Model<Vec<T>>);
impl<T: Serialize + for<'de> Deserialize<'de>> Deref for VecModel<T> {
type Target = Model<Vec<T>>;
@@ -240,6 +260,11 @@ impl<T: Serialize + for<'de> Deserialize<'de>> VecModel<T> {
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> {
fn from(model: Model<Vec<T>>) -> Self {
VecModel(From::from(JsonPointer::from(model)))
@@ -263,6 +288,14 @@ where
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> {
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>)
where
T: Serialize + for<'de> Deserialize<'de> + Map,
@@ -303,6 +336,15 @@ where
&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>
where
T: Serialize + for<'de> Deserialize<'de> + Map,