aldrin_core/adapters/
value.rs1use 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}