aldrin_core/impls/
set.rs

1#[cfg(feature = "introspection")]
2use crate::introspection::{ir, Introspectable, LexicalId, References};
3use crate::tags::{KeyTag, PrimaryKeyTag, PrimaryTag, Set};
4use crate::{
5    Deserialize, DeserializeError, DeserializeKey, Deserializer, Serialize, SerializeError,
6    SerializeKey, Serializer,
7};
8use std::collections::{BTreeSet, HashSet};
9use std::hash::{BuildHasher, Hash};
10
11impl<K: PrimaryKeyTag, S> PrimaryTag for HashSet<K, S> {
12    type Tag = Set<K::KeyTag>;
13}
14
15impl<K, T, S> Serialize<Set<K>> for HashSet<T, S>
16where
17    K: KeyTag,
18    T: SerializeKey<K>,
19{
20    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
21        serializer.serialize_set2_iter(self)
22    }
23}
24
25impl<'a, K, T, S> Serialize<Set<K>> for &'a HashSet<T, S>
26where
27    K: KeyTag,
28    &'a T: SerializeKey<K>,
29{
30    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
31        serializer.serialize_set2_iter(self)
32    }
33}
34
35impl<K, T, S> Deserialize<Set<K>> for HashSet<T, S>
36where
37    K: KeyTag,
38    T: DeserializeKey<K> + Eq + Hash,
39    S: Default + BuildHasher,
40{
41    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
42        deserializer.deserialize_set_extend_new()
43    }
44}
45
46#[cfg(feature = "introspection")]
47impl<T: Introspectable, S> Introspectable for HashSet<T, S> {
48    fn layout() -> ir::LayoutIr {
49        ir::BuiltInTypeIr::Set(T::lexical_id()).into()
50    }
51
52    fn lexical_id() -> LexicalId {
53        LexicalId::set(T::lexical_id())
54    }
55
56    fn add_references(references: &mut References) {
57        references.add::<T>()
58    }
59}
60
61impl<K: PrimaryKeyTag> PrimaryTag for BTreeSet<K> {
62    type Tag = Set<K::KeyTag>;
63}
64
65impl<K, T> Serialize<Set<K>> for BTreeSet<T>
66where
67    K: KeyTag,
68    T: SerializeKey<K>,
69{
70    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
71        serializer.serialize_set2_iter(self)
72    }
73}
74
75impl<'a, K, T> Serialize<Set<K>> for &'a BTreeSet<T>
76where
77    K: KeyTag,
78    &'a T: SerializeKey<K>,
79{
80    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
81        serializer.serialize_set2_iter(self)
82    }
83}
84
85impl<K, T> Deserialize<Set<K>> for BTreeSet<T>
86where
87    K: KeyTag,
88    T: DeserializeKey<K> + Ord,
89{
90    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
91        deserializer.deserialize_set_extend_new()
92    }
93}
94
95#[cfg(feature = "introspection")]
96impl<T: Introspectable> Introspectable for BTreeSet<T> {
97    fn layout() -> ir::LayoutIr {
98        ir::BuiltInTypeIr::Set(T::lexical_id()).into()
99    }
100
101    fn lexical_id() -> LexicalId {
102        LexicalId::set(T::lexical_id())
103    }
104
105    fn add_references(references: &mut References) {
106        references.add::<T>()
107    }
108}
109
110impl<T: KeyTag> Serialize<Set<T>> for () {
111    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
112        serializer.serialize_set2::<T>()?.finish()
113    }
114}
115
116impl<T: KeyTag> Serialize<Set<T>> for &() {
117    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
118        serializer.serialize_set2::<T>()?.finish()
119    }
120}
121
122impl<T: KeyTag> Deserialize<Set<T>> for () {
123    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
124        deserializer.deserialize_set::<T>()?.finish(())
125    }
126}