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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user