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