Skip to main content

cgp_serde/providers/
fields.rs

1use cgp::core::field::traits::StaticString;
2use cgp::prelude::*;
3use serde::ser::SerializeMap;
4
5use crate::components::{CanSerializeValue, ValueSerializer, ValueSerializerComponent};
6use crate::types::SerializeWithContext;
7
8#[cgp_impl(new SerializeFields)]
9impl<Value> ValueSerializer<Value>
10where
11    Value: HasFields,
12    Value::Fields: FieldsSerializer<Self, Value>,
13{
14    fn serialize<S>(&self, value: &Value, serializer: S) -> Result<S::Ok, S::Error>
15    where
16        S: serde::Serializer,
17    {
18        let s = serializer.serialize_map(None)?;
19        Value::Fields::serialize_fields(self, value, s)
20    }
21}
22
23trait FieldsSerializer<Context, Value> {
24    fn serialize_fields<S>(
25        context: &Context,
26        value: &Value,
27        serializer: S,
28    ) -> Result<S::Ok, S::Error>
29    where
30        S: SerializeMap;
31}
32
33impl<Context, Value, Tag, FieldValue, Rest> FieldsSerializer<Context, Value>
34    for Cons<Field<Tag, FieldValue>, Rest>
35where
36    Tag: StaticString,
37    Value: HasField<Tag, Value = FieldValue>,
38    Context: CanSerializeValue<FieldValue>,
39    Rest: FieldsSerializer<Context, Value>,
40{
41    fn serialize_fields<S>(
42        context: &Context,
43        value: &Value,
44        mut serializer: S,
45    ) -> Result<S::Ok, S::Error>
46    where
47        S: SerializeMap,
48    {
49        let field_value = value.get_field(PhantomData);
50        serializer.serialize_entry(
51            Tag::VALUE,
52            &SerializeWithContext {
53                context,
54                value: field_value,
55            },
56        )?;
57        Rest::serialize_fields(context, value, serializer)
58    }
59}
60
61impl<Context, Value> FieldsSerializer<Context, Value> for Nil {
62    fn serialize_fields<S>(
63        _context: &Context,
64        _value: &Value,
65        serializer: S,
66    ) -> Result<S::Ok, S::Error>
67    where
68        S: SerializeMap,
69    {
70        serializer.end()
71    }
72}