aldrin_core/adapters/
value.rs

1use crate::tags::{self, PrimaryTag, Tag};
2use crate::{Serialize, SerializeError, Serializer};
3use std::fmt;
4use std::marker::PhantomData;
5
6pub struct AsValue<T, U> {
7    pub inner: U,
8    tag: PhantomData<T>,
9}
10
11impl<T, U> AsValue<T, U> {
12    pub fn new(inner: U) -> Self {
13        Self {
14            inner,
15            tag: PhantomData,
16        }
17    }
18
19    pub fn into_inner(self) -> U {
20        self.inner
21    }
22}
23
24impl<T, U> PrimaryTag for AsValue<T, U> {
25    type Tag = tags::Value;
26}
27
28impl<T: Tag, U: Serialize<T>> Serialize<tags::Value> for AsValue<T, U> {
29    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
30        serializer.serialize(self.inner)
31    }
32}
33
34impl<'a, T, U> Serialize<tags::Value> for &'a AsValue<T, U>
35where
36    T: Tag,
37    &'a U: Serialize<T>,
38{
39    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
40        serializer.serialize(&self.inner)
41    }
42}
43
44impl<T, U: fmt::Debug> fmt::Debug for AsValue<T, U> {
45    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
46        f.debug_struct("AsValue")
47            .field("inner", &self.inner)
48            .finish()
49    }
50}