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}