cgp_serde/providers/
fields.rs1use 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}