feat(codec): improve KeyValuePairs ergonomics (#515)

This commit is contained in:
Santiago Carmuega 2024-10-01 09:00:23 -03:00 committed by GitHub
parent 615e2d4c29
commit 80d121d13a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -4,7 +4,7 @@ use minicbor::{
Decode, Encode,
};
use serde::{Deserialize, Serialize};
use std::{fmt, hash::Hash as StdHash, ops::Deref};
use std::{collections::HashMap, fmt, hash::Hash as StdHash, ops::Deref};
static TAG_SET: u64 = 258;
@ -64,6 +64,16 @@ where
}
}
impl<K, V> FromIterator<(K, V)> for KeyValuePairs<K, V>
where
K: Clone,
V: Clone,
{
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
KeyValuePairs::Def(Vec::from_iter(iter))
}
}
impl<K, V> From<KeyValuePairs<K, V>> for Vec<(K, V)>
where
K: Clone,
@ -87,6 +97,28 @@ where
}
}
impl<K, V> From<KeyValuePairs<K, V>> for HashMap<K, V>
where
K: Clone + Eq + std::hash::Hash,
V: Clone,
{
fn from(other: KeyValuePairs<K, V>) -> Self {
match other {
KeyValuePairs::Def(x) => x.into_iter().collect(),
KeyValuePairs::Indef(x) => x.into_iter().collect(),
}
}
}
impl<K, V> From<HashMap<K, V>> for KeyValuePairs<K, V>
where
K: Clone,
V: Clone,
{
fn from(other: HashMap<K, V>) -> Self {
KeyValuePairs::Def(other.into_iter().collect())
}
}
impl<K, V> Deref for KeyValuePairs<K, V>
where
K: Clone,
@ -230,6 +262,33 @@ where
}
}
impl<K, V> TryFrom<KeyValuePairs<K, V>> for NonEmptyKeyValuePairs<K, V>
where
K: Clone,
V: Clone,
{
type Error = String;
fn try_from(value: KeyValuePairs<K, V>) -> Result<Self, Self::Error> {
match value {
KeyValuePairs::Def(x) => {
if x.is_empty() {
Err("NonEmptyKeyValuePairs must contain at least one element".into())
} else {
Ok(NonEmptyKeyValuePairs::Def(x))
}
}
KeyValuePairs::Indef(x) => {
if x.is_empty() {
Err("NonEmptyKeyValuePairs must contain at least one element".into())
} else {
Ok(NonEmptyKeyValuePairs::Indef(x))
}
}
}
}
}
impl<K, V> Deref for NonEmptyKeyValuePairs<K, V>
where
K: Clone,