mirror of
https://github.com/Start9Labs/patch-db.git
synced 2026-03-26 10:21:53 +00:00
stop using index trait
This commit is contained in:
committed by
Aiden McClelland
parent
8128321f0d
commit
6b350b3d2d
@@ -1,7 +1,7 @@
|
|||||||
use std::collections::{BTreeMap, HashMap};
|
use std::collections::{BTreeMap, HashMap};
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::ops::{Deref, DerefMut, Index};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
|
||||||
use json_ptr::JsonPointer;
|
use json_ptr::JsonPointer;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@@ -228,9 +228,30 @@ impl<T: Serialize + for<'de> Deserialize<'de>> HasModel for Vec<T> {
|
|||||||
type Model = VecModel<T>;
|
type Model = VecModel<T>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait Map {
|
||||||
|
type Key: AsRef<str>;
|
||||||
|
type Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<K: AsRef<str>, V> Map for HashMap<K, V> {
|
||||||
|
type Key = K;
|
||||||
|
type Value = V;
|
||||||
|
}
|
||||||
|
impl<K: AsRef<str>, V> Map for BTreeMap<K, V> {
|
||||||
|
type Key = K;
|
||||||
|
type Value = V;
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct MapModel<T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>>(Model<T>);
|
pub struct MapModel<T>(Model<T>)
|
||||||
impl<T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>> Deref for MapModel<T> {
|
where
|
||||||
|
T: Serialize + for<'de> Deserialize<'de> + Map,
|
||||||
|
T::Value: Serialize + for<'de> Deserialize<'de>;
|
||||||
|
impl<T> Deref for MapModel<T>
|
||||||
|
where
|
||||||
|
T: Serialize + for<'de> Deserialize<'de> + Map,
|
||||||
|
T::Value: Serialize + for<'de> Deserialize<'de>,
|
||||||
|
{
|
||||||
type Target = Model<T>;
|
type Target = Model<T>;
|
||||||
fn deref(&self) -> &Self::Target {
|
fn deref(&self) -> &Self::Target {
|
||||||
&self.0
|
&self.0
|
||||||
@@ -238,31 +259,26 @@ impl<T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>> Deref fo
|
|||||||
}
|
}
|
||||||
impl<T> MapModel<T>
|
impl<T> MapModel<T>
|
||||||
where
|
where
|
||||||
T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>,
|
T: Serialize + for<'de> Deserialize<'de> + Map,
|
||||||
for<'a, 'de> <T as Index<&'a str>>::Output: Serialize + Deserialize<'de>,
|
T::Value: Serialize + for<'de> Deserialize<'de>,
|
||||||
{
|
{
|
||||||
pub fn idx(&self, idx: &str) -> Model<Option<<T as Index<&str>>::Output>> {
|
pub fn idx(&self, idx: &<T as Map>::Key) -> Model<Option<<T as Map>::Value>> {
|
||||||
self.child(idx)
|
self.child(idx.as_ref())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<T> MapModel<T>
|
impl<T> MapModel<T>
|
||||||
where
|
where
|
||||||
T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>,
|
T: Serialize + for<'de> Deserialize<'de> + Map,
|
||||||
for<'a, 'de> <T as Index<&'a str>>::Output: Serialize + Deserialize<'de> + HasModel,
|
T::Value: Serialize + for<'de> Deserialize<'de> + HasModel,
|
||||||
{
|
{
|
||||||
pub fn idx_model(&self, idx: &str) -> OptionModel<<T as Index<&str>>::Output> {
|
pub fn idx_model(&self, idx: &<T as Map>::Key) -> OptionModel<<T as Map>::Value> {
|
||||||
self.child(idx).into()
|
self.child(idx.as_ref()).into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>> From<Model<Box<T>>>
|
impl<T> From<JsonPointer> for MapModel<T>
|
||||||
for MapModel<T>
|
where
|
||||||
{
|
T: Serialize + for<'de> Deserialize<'de> + Map,
|
||||||
fn from(model: Model<Box<T>>) -> Self {
|
T::Value: Serialize + for<'de> Deserialize<'de>,
|
||||||
MapModel(From::from(JsonPointer::from(model)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>> From<JsonPointer>
|
|
||||||
for MapModel<T>
|
|
||||||
{
|
{
|
||||||
fn from(ptr: JsonPointer) -> Self {
|
fn from(ptr: JsonPointer) -> Self {
|
||||||
MapModel(From::from(ptr))
|
MapModel(From::from(ptr))
|
||||||
@@ -270,7 +286,8 @@ impl<T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>> From<Jso
|
|||||||
}
|
}
|
||||||
impl<T> AsRef<JsonPointer> for MapModel<T>
|
impl<T> AsRef<JsonPointer> for MapModel<T>
|
||||||
where
|
where
|
||||||
T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>,
|
T: Serialize + for<'de> Deserialize<'de> + Map,
|
||||||
|
T::Value: Serialize + for<'de> Deserialize<'de>,
|
||||||
{
|
{
|
||||||
fn as_ref(&self) -> &JsonPointer {
|
fn as_ref(&self) -> &JsonPointer {
|
||||||
self.0.as_ref()
|
self.0.as_ref()
|
||||||
@@ -278,17 +295,15 @@ where
|
|||||||
}
|
}
|
||||||
impl<K, V> HasModel for HashMap<K, V>
|
impl<K, V> HasModel for HashMap<K, V>
|
||||||
where
|
where
|
||||||
K: Serialize + for<'de> Deserialize<'de> + Hash + Eq,
|
K: Serialize + for<'de> Deserialize<'de> + Hash + Eq + AsRef<str>,
|
||||||
V: Serialize + for<'de> Deserialize<'de>,
|
V: Serialize + for<'de> Deserialize<'de>,
|
||||||
for<'a> HashMap<K, V>: Index<&'a str>,
|
|
||||||
{
|
{
|
||||||
type Model = MapModel<HashMap<K, V>>;
|
type Model = MapModel<HashMap<K, V>>;
|
||||||
}
|
}
|
||||||
impl<K, V> HasModel for BTreeMap<K, V>
|
impl<K, V> HasModel for BTreeMap<K, V>
|
||||||
where
|
where
|
||||||
K: Serialize + for<'de> Deserialize<'de> + Hash + Eq,
|
K: Serialize + for<'de> Deserialize<'de> + Hash + Eq + AsRef<str>,
|
||||||
V: Serialize + for<'de> Deserialize<'de>,
|
V: Serialize + for<'de> Deserialize<'de>,
|
||||||
for<'a> HashMap<K, V>: Index<&'a str>,
|
|
||||||
{
|
{
|
||||||
type Model = MapModel<HashMap<K, V>>;
|
type Model = MapModel<HashMap<K, V>>;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user