aldrin_core/adapters/
primary.rs

1use crate::tags::{KeyTag, KeyTagImpl, PrimaryKeyTag, PrimaryTag};
2use crate::{
3    Deserialize, DeserializeError, DeserializeKey, DeserializePrimary, Deserializer, Serialize,
4    SerializeError, SerializeKey, SerializePrimary, Serializer,
5};
6
7#[derive(Debug)]
8pub struct AsPrimary<T>(pub T);
9
10impl<T: PrimaryTag> PrimaryTag for AsPrimary<T> {
11    type Tag = T::Tag;
12}
13
14impl<T: SerializePrimary> Serialize<T::Tag> for AsPrimary<T> {
15    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
16        serializer.serialize(self.0)
17    }
18}
19
20impl<'a, T> Serialize<T::Tag> for &'a AsPrimary<T>
21where
22    T: PrimaryTag,
23    &'a T: Serialize<T::Tag>,
24{
25    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
26        serializer.serialize(&self.0)
27    }
28}
29
30impl<T: DeserializePrimary> Deserialize<T::Tag> for AsPrimary<T> {
31    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
32        deserializer.deserialize().map(Self)
33    }
34}
35
36impl<T: PrimaryKeyTag> PrimaryKeyTag for AsPrimary<T> {
37    type KeyTag = T::KeyTag;
38}
39
40impl<T: PrimaryKeyTag + SerializeKey<T::KeyTag>> SerializeKey<T::KeyTag> for AsPrimary<T> {
41    fn try_as_key(
42        &self,
43    ) -> Result<<<T::KeyTag as KeyTag>::Impl as KeyTagImpl>::Key<'_>, SerializeError> {
44        self.0.try_as_key()
45    }
46}
47
48impl<T: PrimaryKeyTag + DeserializeKey<T::KeyTag>> DeserializeKey<T::KeyTag> for AsPrimary<T> {
49    fn try_from_key(
50        key: <<T::KeyTag as KeyTag>::Impl as KeyTagImpl>::Key<'_>,
51    ) -> Result<Self, DeserializeError> {
52        T::try_from_key(key).map(Self)
53    }
54}