1use crate::binary::encoder::encode_value;
2use crate::buffer::{WriterFactory, Writer};
3use crate::codec::ValueEncodeVisitor;
4use crate::decoder::{DecodeError, Decoder};
5use crate::encoder::{EncodeError, Encoder};
6use crate::fields::FieldTypes;
7use crate::mem::MemoryManager;
8use crate::state_object::field_types::unnamed_struct_type;
9use crate::state_object::value_field::ObjectFieldValue;
10use crate::structs::{StructDecodeVisitor, StructEncodeVisitor, StructType};
11use crate::value::SchemaValue;
12
13pub fn encode_object_value<'a, 'b, V: ObjectValue>(value: &V::In<'b>, writer_factory: &'a dyn WriterFactory) -> Result<&'a [u8], EncodeError> {
15    struct Visitor<'c, 'd, U:ObjectValue>(&'c U::In<'d>);
16    impl <'c, 'd, U:ObjectValue> ValueEncodeVisitor for Visitor<'c, 'd, U> {
17        fn encode(&self, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
18            U::encode(self.0, encoder)
19        }
20    }
21    encode_value(&Visitor::<V>(value), writer_factory)
22}
23
24pub fn decode_object_value<'a, V: ObjectValue>(input: &'a [u8], memory_manager: &'a MemoryManager) -> Result<V::Out<'a>, DecodeError> {
26    let mut decoder = crate::binary::decoder::Decoder { buf: input, scope: memory_manager };
27    V::decode(&mut decoder, memory_manager)
28}
29
30pub trait ObjectValue {
32    type FieldTypes<'a>: FieldTypes;
34    type In<'a>;
36    type Out<'a>;
38    const PSEUDO_TYPE: StructType<'static>;
40
41    fn encode<'a>(value: &Self::In<'a>, encoder: &mut dyn Encoder) -> Result<(), EncodeError>;
43
44    fn decode<'a>(decoder: &mut dyn Decoder<'a>, mem: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError>;
46}
47
48impl ObjectValue for () {
49    type FieldTypes<'a> = ();
50    type In<'a> = ();
51    type Out<'a> = ();
52    const PSEUDO_TYPE: StructType<'static> = unnamed_struct_type::<Self::FieldTypes<'static>>();
53
54    fn encode<'a>(value: &Self::In<'a>, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
55        Ok(())
56    }
57
58    fn decode<'a>(decoder: &mut dyn Decoder<'a>, mem: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
59        Ok(())
60    }
61}
62
63impl<A: ObjectFieldValue> ObjectValue for A {
64    type FieldTypes<'a> = (<<A as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type,);
65    type In<'a> = A::In<'a>;
66    type Out<'a> = A::Out<'a>;
67    const PSEUDO_TYPE: StructType<'static> = unnamed_struct_type::<Self::FieldTypes<'static>>();
68
69    fn encode<'a>(value: &Self::In<'a>, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
70        struct Visitor<'b, A>(&'b A);
71        unsafe impl <'b, 'a:'b, A: SchemaValue<'a>> StructEncodeVisitor for Visitor<'b, A> {
72            fn encode_field(&self, index: usize, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
73                match index {
74                    0 => <A as SchemaValue<'a>>::encode(&self.0, encoder),
75                    _ =>
76                        Err(EncodeError::UnknownError),
77                }
78            }
79        }
80
81        encoder.encode_struct(&Visitor(value), &Self::PSEUDO_TYPE)
82    }
83
84    fn decode<'a>(decoder: &mut dyn Decoder<'a>, mem: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
85        struct Visitor<'a, A: SchemaValue<'a>>(A::DecodeState);
86        unsafe impl <'a, A: SchemaValue<'a>> StructDecodeVisitor<'a> for Visitor<'a, A> {
87            fn decode_field(&mut self, index: usize, decoder: &mut dyn Decoder<'a>) -> Result<(), DecodeError> {
88                match index {
89                    0 => <A as SchemaValue<'a>>::visit_decode_state(&mut self.0, decoder),
90                    _ => Err(DecodeError::UnknownFieldNumber),
91                }
92            }
93        }
94
95        let mut visitor: Visitor<'a, A::Out<'a>> = Visitor(Default::default());
96        decoder.decode_struct(&mut visitor, &Self::PSEUDO_TYPE)?;
97        Ok(<A::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.0, mem)?)
98    }
99}
100
101impl<A: ObjectFieldValue> ObjectValue for (A,) {
102    type FieldTypes<'a> = (<<A as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type,);
103    type In<'a> = (A::In<'a>,);
104    type Out<'a> = (A::Out<'a>,);
105    const PSEUDO_TYPE: StructType<'static> = unnamed_struct_type::<Self::FieldTypes<'static>>();
106
107    fn encode<'a>(value: &Self::In<'a>, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
108        struct Visitor<'b, A>(&'b (A,));
109        unsafe impl <'b, 'a:'b, A: SchemaValue<'a>> StructEncodeVisitor for Visitor<'b, A> {
110            fn encode_field(&self, index: usize, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
111                match index {
112                    0 => <A as SchemaValue<'a>>::encode(&self.0.0, encoder),
113                    _ =>
114                        Err(EncodeError::UnknownError),
115                }
116            }
117        }
118
119        encoder.encode_struct(&Visitor(value), &Self::PSEUDO_TYPE)
120    }
121
122    fn decode<'a>(decoder: &mut dyn Decoder<'a>, mem: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
123        Ok((<A as ObjectValue>::decode(decoder, mem)?,))
124    }
125}
126
127impl<A: ObjectFieldValue, B: ObjectFieldValue> ObjectValue for (A, B) {
128    type FieldTypes<'a> = (<<A as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type, <<B as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type);
129    type In<'a> = (A::In<'a>, B::In<'a>);
130    type Out<'a> = (A::Out<'a>, B::Out<'a>);
131    const PSEUDO_TYPE: StructType<'static> = unnamed_struct_type::<Self::FieldTypes<'static>>();
132
133    fn encode<'a>(value: &Self::In<'a>, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
134        struct EncodeVisitor<'b, A, B>(&'b (A, B));
135        unsafe impl <'b, 'a:'b, A: SchemaValue<'a>, B: SchemaValue<'a>> StructEncodeVisitor for EncodeVisitor<'b, A, B> {
136            fn encode_field(&self, index: usize, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
137                match index {
138                    0 => <A as SchemaValue<'a>>::encode(&self.0.0, encoder),
139                    1 => <B as SchemaValue<'a>>::encode(&self.0.1, encoder),
140                    _ =>
141                        Err(EncodeError::UnknownError),
142                }
143            }
144        }
145
146        encoder.encode_struct(&EncodeVisitor(value), &Self::PSEUDO_TYPE)
147    }
148
149    fn decode<'a>(decoder: &mut dyn Decoder<'a>, mem: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
150        struct Visitor<'a, A: SchemaValue<'a>, B: SchemaValue<'a>>(A::DecodeState, B::DecodeState);
151        unsafe impl <'a, A: SchemaValue<'a>, B: SchemaValue<'a>> StructDecodeVisitor<'a> for Visitor<'a, A, B> {
152            fn decode_field(&mut self, index: usize, decoder: &mut dyn Decoder<'a>) -> Result<(), DecodeError> {
153                match index {
154                    0 => <A as SchemaValue<'a>>::visit_decode_state(&mut self.0, decoder),
155                    1 => <B as SchemaValue<'a>>::visit_decode_state(&mut self.1, decoder),
156                    _ => Err(DecodeError::UnknownFieldNumber),
157                }
158            }
159        }
160
161        let mut visitor: Visitor<'a, A::Out<'a>, B::Out<'a>> = Visitor(Default::default(), Default::default());
162        decoder.decode_struct(&mut visitor, &Self::PSEUDO_TYPE)?;
163        Ok((
164            <A::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.0, mem)?,
165            <B::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.1, mem)?,
166        ))
167    }
168}
169
170impl<A: ObjectFieldValue, B: ObjectFieldValue, C: ObjectFieldValue> ObjectValue for (A, B, C) {
171    type FieldTypes<'a> = (<<A as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type, <<B as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type, <<C as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type);
172    type In<'a> = (A::In<'a>, B::In<'a>, C::In<'a>);
173    type Out<'a> = (A::Out<'a>, B::Out<'a>, C::Out<'a>);
174    const PSEUDO_TYPE: StructType<'static> = unnamed_struct_type::<Self::FieldTypes<'static>>();
175
176    fn encode<'a>(value: &Self::In<'a>, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
177        struct EncodeVisitor<'b, A, B, C>(&'b (A, B, C));
178        unsafe impl <'b, 'a:'b, A: SchemaValue<'a>, B: SchemaValue<'a>, C: SchemaValue<'a>> StructEncodeVisitor for EncodeVisitor<'b, A, B, C> {
179            fn encode_field(&self, index: usize, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
180                match index {
181                    0 => <A as SchemaValue<'a>>::encode(&self.0.0, encoder),
182                    1 => <B as SchemaValue<'a>>::encode(&self.0.1, encoder),
183                    2 => <C as SchemaValue<'a>>::encode(&self.0.2, encoder),
184                    _ =>
185                        Err(EncodeError::UnknownError),
186                }
187            }
188        }
189
190        encoder.encode_struct(&EncodeVisitor(value), &Self::PSEUDO_TYPE)
191    }
192
193    fn decode<'a>(decoder: &mut dyn Decoder<'a>, mem: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
194        struct Visitor<'a, A: SchemaValue<'a>, B: SchemaValue<'a>, C: SchemaValue<'a>>(A::DecodeState, B::DecodeState, C::DecodeState);
195        unsafe impl <'a, A: SchemaValue<'a>, B: SchemaValue<'a>, C: SchemaValue<'a>> StructDecodeVisitor<'a> for Visitor<'a, A, B, C> {
196            fn decode_field(&mut self, index: usize, decoder: &mut dyn Decoder<'a>) -> Result<(), DecodeError> {
197                match index {
198                    0 => <A as SchemaValue<'a>>::visit_decode_state(&mut self.0, decoder),
199                    1 => <B as SchemaValue<'a>>::visit_decode_state(&mut self.1, decoder),
200                    2 => <C as SchemaValue<'a>>::visit_decode_state(&mut self.2, decoder),
201                    _ => Err(DecodeError::UnknownFieldNumber),
202                }
203            }
204        }
205
206        let mut visitor: Visitor<'a, A::Out<'a>, B::Out<'a>, C::Out<'a>> = Visitor(Default::default(), Default::default(), Default::default());
207        decoder.decode_struct(&mut visitor, &Self::PSEUDO_TYPE)?;
208        Ok((
209            <A::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.0, mem)?,
210            <B::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.1, mem)?,
211            <C::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.2, mem)?,
212        ))
213    }
214}
215
216impl<A: ObjectFieldValue, B: ObjectFieldValue, C: ObjectFieldValue, D: ObjectFieldValue> ObjectValue for (A, B, C, D) {
217    type FieldTypes<'a> = (<<A as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type, <<B as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type, <<C as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type, <<D as ObjectFieldValue>::In<'a> as SchemaValue<'a>>::Type);
218    type In<'a> = (A::In<'a>, B::In<'a>, C::In<'a>, D::In<'a>);
219    type Out<'a> = (A::Out<'a>, B::Out<'a>, C::Out<'a>, D::Out<'a>);
220    const PSEUDO_TYPE: StructType<'static> = unnamed_struct_type::<Self::FieldTypes<'static>>();
221
222    fn encode<'a>(value: &Self::In<'a>, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
223        struct EncodeVisitor<'b, A, B, C, D>(&'b (A, B, C, D));
224        unsafe impl <'b, 'a:'b, A: SchemaValue<'a>, B: SchemaValue<'a>, C: SchemaValue<'a>, D: SchemaValue<'a>> StructEncodeVisitor for EncodeVisitor<'b, A, B, C, D> {
225            fn encode_field(&self, index: usize, encoder: &mut dyn Encoder) -> Result<(), EncodeError> {
226                match index {
227                    0 => <A as SchemaValue<'a>>::encode(&self.0.0, encoder),
228                    1 => <B as SchemaValue<'a>>::encode(&self.0.1, encoder),
229                    2 => <C as SchemaValue<'a>>::encode(&self.0.2, encoder),
230                    3 => <D as SchemaValue<'a>>::encode(&self.0.3, encoder),
231                    _ =>
232                        Err(EncodeError::UnknownError),
233                }
234            }
235        }
236
237        encoder.encode_struct(&EncodeVisitor(value), &Self::PSEUDO_TYPE)
238    }
239
240    fn decode<'a>(decoder: &mut dyn Decoder<'a>, mem: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
241        struct Visitor<'a, A: SchemaValue<'a>, B: SchemaValue<'a>, C: SchemaValue<'a>, D: SchemaValue<'a>>(A::DecodeState, B::DecodeState, C::DecodeState, D::DecodeState);
242        unsafe impl <'a, A: SchemaValue<'a>, B: SchemaValue<'a>, C: SchemaValue<'a>, D: SchemaValue<'a>> StructDecodeVisitor<'a> for Visitor<'a, A, B, C, D> {
243            fn decode_field(&mut self, index: usize, decoder: &mut dyn Decoder<'a>) -> Result<(), DecodeError> {
244                match index {
245                    0 => <A as SchemaValue<'a>>::visit_decode_state(&mut self.0, decoder),
246                    1 => <B as SchemaValue<'a>>::visit_decode_state(&mut self.1, decoder),
247                    2 => <C as SchemaValue<'a>>::visit_decode_state(&mut self.2, decoder),
248                    3 => <D as SchemaValue<'a>>::visit_decode_state(&mut self.3, decoder),
249                    _ => Err(DecodeError::UnknownFieldNumber),
250                }
251            }
252        }
253
254        let mut visitor: Visitor<'a, A::Out<'a>, B::Out<'a>, C::Out<'a>, D::Out<'a>> = Visitor(Default::default(), Default::default(), Default::default(), Default::default());
255        decoder.decode_struct(&mut visitor, &Self::PSEUDO_TYPE)?;
256        Ok((
257            <A::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.0, mem)?,
258            <B::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.1, mem)?,
259            <C::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.2, mem)?,
260            <D::Out<'a> as SchemaValue<'a>>::finish_decode_state(visitor.3, mem)?,
261        ))
262    }
263}
264