From 6b350b3d2d166fa34b516a01245d379163e6d65a Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Mon, 26 Apr 2021 16:36:50 -0600 Subject: [PATCH] stop using index trait --- patch-db/src/model.rs | 65 ++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/patch-db/src/model.rs b/patch-db/src/model.rs index 8894b74..1cc71de 100644 --- a/patch-db/src/model.rs +++ b/patch-db/src/model.rs @@ -1,7 +1,7 @@ use std::collections::{BTreeMap, HashMap}; use std::hash::Hash; use std::marker::PhantomData; -use std::ops::{Deref, DerefMut, Index}; +use std::ops::{Deref, DerefMut}; use json_ptr::JsonPointer; use serde::{Deserialize, Serialize}; @@ -228,9 +228,30 @@ impl Deserialize<'de>> HasModel for Vec { type Model = VecModel; } +pub trait Map { + type Key: AsRef; + type Value; +} + +impl, V> Map for HashMap { + type Key = K; + type Value = V; +} +impl, V> Map for BTreeMap { + type Key = K; + type Value = V; +} + #[derive(Debug, Clone)] -pub struct MapModel Deserialize<'de> + for<'a> Index<&'a str>>(Model); -impl Deserialize<'de> + for<'a> Index<&'a str>> Deref for MapModel { +pub struct MapModel(Model) +where + T: Serialize + for<'de> Deserialize<'de> + Map, + T::Value: Serialize + for<'de> Deserialize<'de>; +impl Deref for MapModel +where + T: Serialize + for<'de> Deserialize<'de> + Map, + T::Value: Serialize + for<'de> Deserialize<'de>, +{ type Target = Model; fn deref(&self) -> &Self::Target { &self.0 @@ -238,31 +259,26 @@ impl Deserialize<'de> + for<'a> Index<&'a str>> Deref fo } impl MapModel where - T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>, - for<'a, 'de> >::Output: Serialize + Deserialize<'de>, + T: Serialize + for<'de> Deserialize<'de> + Map, + T::Value: Serialize + for<'de> Deserialize<'de>, { - pub fn idx(&self, idx: &str) -> Model>::Output>> { - self.child(idx) + pub fn idx(&self, idx: &::Key) -> Model::Value>> { + self.child(idx.as_ref()) } } impl MapModel where - T: Serialize + for<'de> Deserialize<'de> + for<'a> Index<&'a str>, - for<'a, 'de> >::Output: Serialize + Deserialize<'de> + HasModel, + T: Serialize + for<'de> Deserialize<'de> + Map, + T::Value: Serialize + for<'de> Deserialize<'de> + HasModel, { - pub fn idx_model(&self, idx: &str) -> OptionModel<>::Output> { - self.child(idx).into() + pub fn idx_model(&self, idx: &::Key) -> OptionModel<::Value> { + self.child(idx.as_ref()).into() } } -impl Deserialize<'de> + for<'a> Index<&'a str>> From>> - for MapModel -{ - fn from(model: Model>) -> Self { - MapModel(From::from(JsonPointer::from(model))) - } -} -impl Deserialize<'de> + for<'a> Index<&'a str>> From - for MapModel +impl From for MapModel +where + T: Serialize + for<'de> Deserialize<'de> + Map, + T::Value: Serialize + for<'de> Deserialize<'de>, { fn from(ptr: JsonPointer) -> Self { MapModel(From::from(ptr)) @@ -270,7 +286,8 @@ impl Deserialize<'de> + for<'a> Index<&'a str>> From AsRef for MapModel 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 { self.0.as_ref() @@ -278,17 +295,15 @@ where } impl HasModel for HashMap where - K: Serialize + for<'de> Deserialize<'de> + Hash + Eq, + K: Serialize + for<'de> Deserialize<'de> + Hash + Eq + AsRef, V: Serialize + for<'de> Deserialize<'de>, - for<'a> HashMap: Index<&'a str>, { type Model = MapModel>; } impl HasModel for BTreeMap where - K: Serialize + for<'de> Deserialize<'de> + Hash + Eq, + K: Serialize + for<'de> Deserialize<'de> + Hash + Eq + AsRef, V: Serialize + for<'de> Deserialize<'de>, - for<'a> HashMap: Index<&'a str>, { type Model = MapModel>; }