xref: /aosp_15_r20/external/flatbuffers/rust/flexbuffers/src/reader/serialize.rs (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker // Copyright 2021 Google LLC
2*890232f2SAndroid Build Coastguard Worker //
3*890232f2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*890232f2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*890232f2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*890232f2SAndroid Build Coastguard Worker //
7*890232f2SAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*890232f2SAndroid Build Coastguard Worker //
9*890232f2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*890232f2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*890232f2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*890232f2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*890232f2SAndroid Build Coastguard Worker // limitations under the License.
14*890232f2SAndroid Build Coastguard Worker 
15*890232f2SAndroid Build Coastguard Worker use crate::reader::Reader;
16*890232f2SAndroid Build Coastguard Worker use crate::Buffer;
17*890232f2SAndroid Build Coastguard Worker use crate::{BitWidth::*, FlexBufferType::*};
18*890232f2SAndroid Build Coastguard Worker use serde::ser;
19*890232f2SAndroid Build Coastguard Worker use serde::ser::{SerializeMap, SerializeSeq};
20*890232f2SAndroid Build Coastguard Worker 
21*890232f2SAndroid Build Coastguard Worker impl<B: Buffer> ser::Serialize for &Reader<B> {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: ser::Serializer,22*890232f2SAndroid Build Coastguard Worker     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
23*890232f2SAndroid Build Coastguard Worker     where
24*890232f2SAndroid Build Coastguard Worker         S: ser::Serializer,
25*890232f2SAndroid Build Coastguard Worker     {
26*890232f2SAndroid Build Coastguard Worker         #[allow(deprecated)]
27*890232f2SAndroid Build Coastguard Worker         match (self.flexbuffer_type(), self.bitwidth()) {
28*890232f2SAndroid Build Coastguard Worker             (Null, _) => serializer.serialize_unit(),
29*890232f2SAndroid Build Coastguard Worker             (Int, W8) | (IndirectInt, W8) => serializer.serialize_i8(self.as_i8()),
30*890232f2SAndroid Build Coastguard Worker             (Int, W16) | (IndirectInt, W16) => serializer.serialize_i16(self.as_i16()),
31*890232f2SAndroid Build Coastguard Worker             (Int, W32) | (IndirectInt, W32) => serializer.serialize_i32(self.as_i32()),
32*890232f2SAndroid Build Coastguard Worker             (Int, W64) | (IndirectInt, W64) => serializer.serialize_i64(self.as_i64()),
33*890232f2SAndroid Build Coastguard Worker             (UInt, W8) | (IndirectUInt, W8) => serializer.serialize_u8(self.as_u8()),
34*890232f2SAndroid Build Coastguard Worker             (UInt, W16) | (IndirectUInt, W16) => serializer.serialize_u16(self.as_u16()),
35*890232f2SAndroid Build Coastguard Worker             (UInt, W32) | (IndirectUInt, W32) => serializer.serialize_u32(self.as_u32()),
36*890232f2SAndroid Build Coastguard Worker             (UInt, W64) | (IndirectUInt, W64) => serializer.serialize_u64(self.as_u64()),
37*890232f2SAndroid Build Coastguard Worker             (Float, W32) | (IndirectFloat, W32) => serializer.serialize_f32(self.as_f32()),
38*890232f2SAndroid Build Coastguard Worker             (Float, _) | (IndirectFloat, _) => serializer.serialize_f64(self.as_f64()),
39*890232f2SAndroid Build Coastguard Worker             (Bool, _) => serializer.serialize_bool(self.as_bool()),
40*890232f2SAndroid Build Coastguard Worker             (Key, _) | (String, _) => serializer.serialize_str(&self.as_str()),
41*890232f2SAndroid Build Coastguard Worker             (Map, _) => {
42*890232f2SAndroid Build Coastguard Worker                 let m = self.as_map();
43*890232f2SAndroid Build Coastguard Worker                 let mut map_serializer = serializer.serialize_map(Some(m.len()))?;
44*890232f2SAndroid Build Coastguard Worker                 for (k, v) in m.iter_keys().zip(m.iter_values()) {
45*890232f2SAndroid Build Coastguard Worker                     map_serializer.serialize_key(&&k)?;
46*890232f2SAndroid Build Coastguard Worker                     map_serializer.serialize_value(&&v)?;
47*890232f2SAndroid Build Coastguard Worker                 }
48*890232f2SAndroid Build Coastguard Worker                 map_serializer.end()
49*890232f2SAndroid Build Coastguard Worker             }
50*890232f2SAndroid Build Coastguard Worker             (Vector, _)
51*890232f2SAndroid Build Coastguard Worker             | (VectorInt, _)
52*890232f2SAndroid Build Coastguard Worker             | (VectorUInt, _)
53*890232f2SAndroid Build Coastguard Worker             | (VectorFloat, _)
54*890232f2SAndroid Build Coastguard Worker             | (VectorKey, _)
55*890232f2SAndroid Build Coastguard Worker             | (VectorString, _)
56*890232f2SAndroid Build Coastguard Worker             | (VectorBool, _)
57*890232f2SAndroid Build Coastguard Worker             | (VectorInt2, _)
58*890232f2SAndroid Build Coastguard Worker             | (VectorUInt2, _)
59*890232f2SAndroid Build Coastguard Worker             | (VectorFloat2, _)
60*890232f2SAndroid Build Coastguard Worker             | (VectorInt3, _)
61*890232f2SAndroid Build Coastguard Worker             | (VectorUInt3, _)
62*890232f2SAndroid Build Coastguard Worker             | (VectorFloat3, _)
63*890232f2SAndroid Build Coastguard Worker             | (VectorInt4, _)
64*890232f2SAndroid Build Coastguard Worker             | (VectorUInt4, _)
65*890232f2SAndroid Build Coastguard Worker             | (VectorFloat4, _) => {
66*890232f2SAndroid Build Coastguard Worker                 let v = self.as_vector();
67*890232f2SAndroid Build Coastguard Worker                 let mut seq_serializer = serializer.serialize_seq(Some(v.len()))?;
68*890232f2SAndroid Build Coastguard Worker                 for x in v.iter() {
69*890232f2SAndroid Build Coastguard Worker                     seq_serializer.serialize_element(&&x)?;
70*890232f2SAndroid Build Coastguard Worker                 }
71*890232f2SAndroid Build Coastguard Worker                 seq_serializer.end()
72*890232f2SAndroid Build Coastguard Worker             }
73*890232f2SAndroid Build Coastguard Worker             (Blob, _) => serializer.serialize_bytes(&self.as_blob().0),
74*890232f2SAndroid Build Coastguard Worker         }
75*890232f2SAndroid Build Coastguard Worker     }
76*890232f2SAndroid Build Coastguard Worker }
77