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 pub fn new() -> Self { Self(Map::new()) }
11
12 pub fn len(&self) -> usize { self.0.len() }
14
15 pub fn is_empty(&self) -> bool { self.0.is_empty() }
17
18 pub fn iter(&self) -> SetIter<'_> { SetIter::new(self.0.iter()) }
22
23 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 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}