mirror of
https://github.com/Start9Labs/patch-db.git
synced 2026-03-26 10:21:53 +00:00
add clone
This commit is contained in:
committed by
Aiden McClelland
parent
b70f1ce3af
commit
e898d4d7ee
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user