use serde::{de::*, ser::*};
use std::{collections::BTreeMap, hash::Hash, ops::Deref};
pub trait Key {
type Key: Eq + Ord + Hash;
fn key(&self) -> Self::Key;
}
#[derive(Debug, Clone, PartialEq)]
pub struct KeyList<T: Key>(BTreeMap<T::Key, T>);
impl<T: Key> Default for KeyList<T> {
fn default() -> Self {
Self(Default::default())
}
}
impl<T: Key> Deref for KeyList<T> {
type Target = BTreeMap<T::Key, T>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(thiserror::Error, Debug)]
pub enum FromError {
#[error("duplicate keys")]
DuplicateKeys,
}
impl<T: Key, const SIZE: usize> TryFrom<[T; SIZE]> for KeyList<T> {
type Error = FromError;
fn try_from(input: [T; SIZE]) -> Result<Self, Self::Error> {
let mut list = Self::default();
for i in input.into_iter() {
if let Some(value) = list.insert(i) {
return Err(FromError::DuplicateKeys);
}
}
Ok(list)
}
}
impl<T: Key> KeyList<T> {
pub fn insert(&mut self, version: T) -> Option<T> {
self.0.insert(version.key(), version)
}
pub fn iter(&self) -> impl Iterator<Item = &T> {
self.0.values()
}
pub fn into_iter(self) -> impl Iterator<Item = T> {
self.0.into_values()
}
pub fn clear(&mut self) {
self.0.clear()
}
}
impl<T: Key> Serialize for KeyList<T>
where
T: Serialize,
T::Key: Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_seq(Some(self.0.len()))?;
for value in self.iter() {
seq.serialize_element(value)?;
}
seq.end()
}
}
impl<'de, T: Key> Deserialize<'de> for KeyList<T>
where
T: DeserializeOwned,
T::Key: DeserializeOwned,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let versions = Vec::<T>::deserialize(deserializer)?;
todo!()
}
}