import_stdlib!();
use crate::{CBOR, CBOREncodable, Error, Map, MapIter, Result};
#[derive(Clone, Default, PartialEq, Eq)]
pub struct Set(Map);
impl Set {
pub fn new() -> Self { Self(Map::new()) }
pub fn len(&self) -> usize { self.0.len() }
pub fn is_empty(&self) -> bool { self.0.is_empty() }
pub fn iter(&self) -> SetIter<'_> { SetIter::new(self.0.iter()) }
pub fn insert<T>(&mut self, value: T)
where
T: Into<CBOR> + Clone,
{
self.0.insert(value.clone(), value)
}
pub(crate) fn insert_next(&mut self, value: CBOR) -> Result<()> {
self.0.insert_next(value.clone(), value)
}
pub fn contains<T>(&self, value: T) -> bool
where
T: Into<CBOR>,
{
self.0.contains_key(value)
}
}
impl Set {
pub fn as_vec(&self) -> Vec<CBOR> {
self.0.iter().map(|(_, v)| v.clone()).collect()
}
pub fn from_vec<T>(vec: Vec<T>) -> Self
where
T: Into<CBOR> + Clone,
{
let mut set = Set::new();
for item in vec {
set.insert(item);
}
set
}
pub fn try_from_vec<T>(vec: Vec<T>) -> Result<Self>
where
T: Into<CBOR> + Clone,
{
let mut set = Set::new();
for item in vec {
set.insert_next(item.into())?;
}
Ok(set)
}
pub fn cbor_data(&self) -> Vec<u8> { self.as_vec().to_cbor_data() }
}
impl From<Set> for CBOR {
fn from(value: Set) -> Self { value.as_vec().into() }
}
impl<T> TryFrom<Vec<T>> for Set
where
T: Into<CBOR> + Clone,
{
type Error = Error;
fn try_from(vec: Vec<T>) -> Result<Self> { Self::try_from_vec(vec) }
}
impl<T> TryFrom<Set> for Vec<T>
where
T: TryFrom<CBOR, Error = Error> + Clone,
{
type Error = Error;
fn try_from(set: Set) -> Result<Self> {
set.as_vec()
.into_iter()
.map(|item| item.try_into())
.collect()
}
}
impl<T> From<HashSet<T>> for Set
where
T: Into<CBOR> + Clone,
{
fn from(vec: HashSet<T>) -> Self {
Self::from_vec(vec.into_iter().collect())
}
}
impl<T> TryFrom<Set> for HashSet<T>
where
T: TryFrom<CBOR, Error = Error> + Clone + Eq + hash::Hash,
{
type Error = Error;
fn try_from(set: Set) -> Result<Self> {
set.as_vec()
.into_iter()
.map(|item| item.try_into())
.collect()
}
}
impl fmt::Debug for Set {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self.as_vec())
}
}
#[derive(Debug)]
pub struct SetIter<'a>(MapIter<'a>);
impl<'a> SetIter<'a> {
pub fn new(iter: MapIter<'a>) -> Self { Self(iter) }
}
impl<'a> Iterator for SetIter<'a> {
type Item = &'a CBOR;
fn next(&mut self) -> Option<Self::Item> { self.0.next().map(|(_, v)| v) }
}