dcbor/
set.rs

1import_stdlib!();
2
3use crate::{CBOR, CBOREncodable, Error, Map, MapIter, Result};
4
5#[derive(Clone, Default, PartialEq, Eq)]
6pub struct Set(Map);
7
8impl Set {
9    /// Makes a new, empty CBOR `Set`.
10    pub fn new() -> Self { Self(Map::new()) }
11
12    /// Returns the number of elements in the set.
13    pub fn len(&self) -> usize { self.0.len() }
14
15    /// Checks if the set is empty.
16    pub fn is_empty(&self) -> bool { self.0.is_empty() }
17
18    /// Gets an iterator over the elements in the CBOR set.
19    ///
20    /// Order is lexicographically by the value's binary-encoded CBOR.
21    pub fn iter(&self) -> SetIter<'_> { SetIter::new(self.0.iter()) }
22
23    /// Inserts a value into the set.
24    pub fn insert<T>(&mut self, value: T)
25    where
26        T: Into<CBOR> + Clone,
27    {
28        self.0.insert(value.clone(), value)
29    }
30
31    pub(crate) fn insert_next(&mut self, value: CBOR) -> Result<()> {
32        self.0.insert_next(value.clone(), value)
33    }
34
35    /// Tests if the set contains a value.
36    pub fn contains<T>(&self, value: T) -> bool
37    where
38        T: Into<CBOR>,
39    {
40        self.0.contains_key(value)
41    }
42}
43
44impl Set {
45    pub fn as_vec(&self) -> Vec<CBOR> {
46        self.0.iter().map(|(_, v)| v.clone()).collect()
47    }
48
49    pub fn from_vec<T>(vec: Vec<T>) -> Self
50    where
51        T: Into<CBOR> + Clone,
52    {
53        let mut set = Set::new();
54        for item in vec {
55            set.insert(item);
56        }
57        set
58    }
59
60    pub fn try_from_vec<T>(vec: Vec<T>) -> Result<Self>
61    where
62        T: Into<CBOR> + Clone,
63    {
64        let mut set = Set::new();
65        for item in vec {
66            set.insert_next(item.into())?;
67        }
68        Ok(set)
69    }
70
71    pub fn cbor_data(&self) -> Vec<u8> { self.as_vec().to_cbor_data() }
72}
73
74impl From<Set> for CBOR {
75    fn from(value: Set) -> Self { value.as_vec().into() }
76}
77
78impl<T> TryFrom<Vec<T>> for Set
79where
80    T: Into<CBOR> + Clone,
81{
82    type Error = Error;
83
84    fn try_from(vec: Vec<T>) -> Result<Self> { Self::try_from_vec(vec) }
85}
86
87impl<T> TryFrom<Set> for Vec<T>
88where
89    T: TryFrom<CBOR, Error = Error> + Clone,
90{
91    type Error = Error;
92
93    fn try_from(set: Set) -> Result<Self> {
94        set.as_vec()
95            .into_iter()
96            .map(|item| item.try_into())
97            .collect()
98    }
99}
100
101impl<T> From<HashSet<T>> for Set
102where
103    T: Into<CBOR> + Clone,
104{
105    fn from(vec: HashSet<T>) -> Self {
106        Self::from_vec(vec.into_iter().collect())
107    }
108}
109
110impl<T> TryFrom<Set> for HashSet<T>
111where
112    T: TryFrom<CBOR, Error = Error> + Clone + Eq + hash::Hash,
113{
114    type Error = Error;
115
116    fn try_from(set: Set) -> Result<Self> {
117        set.as_vec()
118            .into_iter()
119            .map(|item| item.try_into())
120            .collect()
121    }
122}
123
124impl fmt::Debug for Set {
125    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
126        write!(f, "{:?}", self.as_vec())
127    }
128}
129
130#[derive(Debug)]
131pub struct SetIter<'a>(MapIter<'a>);
132
133impl<'a> SetIter<'a> {
134    pub fn new(iter: MapIter<'a>) -> Self { Self(iter) }
135}
136
137impl<'a> Iterator for SetIter<'a> {
138    type Item = &'a CBOR;
139
140    fn next(&mut self) -> Option<Self::Item> { self.0.next().map(|(_, v)| v) }
141}