aldrin_core/adapters/
result.rs

1use crate::tags::{self, PrimaryTag, Tag};
2use crate::{Serialize, SerializeError, Serializer};
3use std::convert::Infallible;
4
5#[derive(Debug, Copy, Clone)]
6pub struct AsOk<T>(pub T);
7
8impl<T: PrimaryTag> PrimaryTag for AsOk<T> {
9    type Tag = Result<T::Tag, tags::Value>;
10}
11
12impl<T: Tag, E: Tag, U: Serialize<T>> Serialize<Result<T, E>> for AsOk<U> {
13    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
14        serializer.serialize::<Result<_, E>>(Ok::<_, Infallible>(self.0))
15    }
16}
17
18impl<'a, T, E, U> Serialize<Result<T, E>> for &'a AsOk<U>
19where
20    T: Tag,
21    E: Tag,
22    &'a U: Serialize<T>,
23{
24    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
25        serializer.serialize::<Result<_, E>>(Ok::<_, Infallible>(&self.0))
26    }
27}
28
29#[derive(Debug, Copy, Clone)]
30pub struct AsErr<T>(pub T);
31
32impl<T: PrimaryTag> PrimaryTag for AsErr<T> {
33    type Tag = Result<tags::Value, T::Tag>;
34}
35
36impl<T: Tag, E: Tag, F: Serialize<E>> Serialize<Result<T, E>> for AsErr<F> {
37    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
38        serializer.serialize::<Result<T, _>>(Err::<Infallible, _>(self.0))
39    }
40}
41
42impl<'a, T, E, F> Serialize<Result<T, E>> for &'a AsErr<F>
43where
44    T: Tag,
45    E: Tag,
46    &'a F: Serialize<E>,
47{
48    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
49        serializer.serialize::<Result<T, _>>(Err::<Infallible, _>(&self.0))
50    }
51}