1*890232f2SAndroid Build Coastguard Worker // Copyright 2019 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 //! Flexbuffers is a high performance schemaless binary data format designed at Google.
16*890232f2SAndroid Build Coastguard Worker //! It is complementary to the schema-ed format [Flatbuffers](http://docs.rs/flatbuffers/).
17*890232f2SAndroid Build Coastguard Worker //! See [Flexbuffer Internals](https://google.github.io/flatbuffers/flatbuffers_internals.html)
18*890232f2SAndroid Build Coastguard Worker //! for details on the binary format.
19*890232f2SAndroid Build Coastguard Worker //!
20*890232f2SAndroid Build Coastguard Worker //! See the examples for usage:
21*890232f2SAndroid Build Coastguard Worker //! * [Example](https://github.com/google/flatbuffers/blob/master/samples/sample_flexbuffers.rs)
22*890232f2SAndroid Build Coastguard Worker //! * [Serde Example](https://github.com/google/flatbuffers/blob/master/samples/sample_flexbuffers_serde.rs)
23*890232f2SAndroid Build Coastguard Worker //!
24*890232f2SAndroid Build Coastguard Worker //! This rust implementation is in progress and, until the 1.0 release, breaking API changes may
25*890232f2SAndroid Build Coastguard Worker //! happen between minor versions.
26*890232f2SAndroid Build Coastguard Worker // TODO(cneo): serde stuff are behind a default-on feature flag
27*890232f2SAndroid Build Coastguard Worker // Reader to Json is behind a default-off feature flag
28*890232f2SAndroid Build Coastguard Worker // Serializable structs are Pushable
29*890232f2SAndroid Build Coastguard Worker // Serde with maps - field names and type names.
30*890232f2SAndroid Build Coastguard Worker
31*890232f2SAndroid Build Coastguard Worker // Until flat/flexbuffers is on Rust v1.42, we cannot use the previously unstable matches! macro.
32*890232f2SAndroid Build Coastguard Worker #![allow(clippy::unknown_clippy_lints)]
33*890232f2SAndroid Build Coastguard Worker #![allow(clippy::match_like_matches_macro)]
34*890232f2SAndroid Build Coastguard Worker
35*890232f2SAndroid Build Coastguard Worker #[macro_use]
36*890232f2SAndroid Build Coastguard Worker extern crate bitflags;
37*890232f2SAndroid Build Coastguard Worker extern crate byteorder;
38*890232f2SAndroid Build Coastguard Worker #[macro_use]
39*890232f2SAndroid Build Coastguard Worker extern crate serde_derive;
40*890232f2SAndroid Build Coastguard Worker extern crate num_enum;
41*890232f2SAndroid Build Coastguard Worker extern crate serde;
42*890232f2SAndroid Build Coastguard Worker
43*890232f2SAndroid Build Coastguard Worker mod bitwidth;
44*890232f2SAndroid Build Coastguard Worker mod buffer;
45*890232f2SAndroid Build Coastguard Worker mod builder;
46*890232f2SAndroid Build Coastguard Worker mod flexbuffer_type;
47*890232f2SAndroid Build Coastguard Worker mod reader;
48*890232f2SAndroid Build Coastguard Worker
49*890232f2SAndroid Build Coastguard Worker pub use bitwidth::BitWidth;
50*890232f2SAndroid Build Coastguard Worker pub use buffer::Buffer;
51*890232f2SAndroid Build Coastguard Worker pub use builder::Error as SerializationError;
52*890232f2SAndroid Build Coastguard Worker pub use builder::{
53*890232f2SAndroid Build Coastguard Worker singleton, Builder, BuilderOptions, FlexbufferSerializer, MapBuilder, Pushable, VectorBuilder,
54*890232f2SAndroid Build Coastguard Worker };
55*890232f2SAndroid Build Coastguard Worker pub use flexbuffer_type::FlexBufferType;
56*890232f2SAndroid Build Coastguard Worker pub use reader::Error as ReaderError;
57*890232f2SAndroid Build Coastguard Worker pub use reader::{DeserializationError, MapReader, Reader, ReaderIterator, VectorReader};
58*890232f2SAndroid Build Coastguard Worker use serde::{Deserialize, Serialize};
59*890232f2SAndroid Build Coastguard Worker
60*890232f2SAndroid Build Coastguard Worker mod private {
61*890232f2SAndroid Build Coastguard Worker pub trait Sealed {}
62*890232f2SAndroid Build Coastguard Worker }
63*890232f2SAndroid Build Coastguard Worker
64*890232f2SAndroid Build Coastguard Worker /// Serialize as a flexbuffer into a vector.
to_vec<T: Serialize>(x: T) -> Result<Vec<u8>, SerializationError>65*890232f2SAndroid Build Coastguard Worker pub fn to_vec<T: Serialize>(x: T) -> Result<Vec<u8>, SerializationError> {
66*890232f2SAndroid Build Coastguard Worker let mut s = FlexbufferSerializer::new();
67*890232f2SAndroid Build Coastguard Worker x.serialize(&mut s)?;
68*890232f2SAndroid Build Coastguard Worker Ok(s.take_buffer())
69*890232f2SAndroid Build Coastguard Worker }
70*890232f2SAndroid Build Coastguard Worker
71*890232f2SAndroid Build Coastguard Worker /// Deserialize a type from a flexbuffer.
from_slice<'de, T: Deserialize<'de>>(buf: &'de [u8]) -> Result<T, DeserializationError>72*890232f2SAndroid Build Coastguard Worker pub fn from_slice<'de, T: Deserialize<'de>>(buf: &'de [u8]) -> Result<T, DeserializationError> {
73*890232f2SAndroid Build Coastguard Worker let r = Reader::get_root(buf)?;
74*890232f2SAndroid Build Coastguard Worker T::deserialize(r)
75*890232f2SAndroid Build Coastguard Worker }
76*890232f2SAndroid Build Coastguard Worker
77*890232f2SAndroid Build Coastguard Worker /// Deserialize a type from a flexbuffer.
from_buffer<'de, T: Deserialize<'de>, B: Buffer>( buf: &'de B, ) -> Result<T, DeserializationError>78*890232f2SAndroid Build Coastguard Worker pub fn from_buffer<'de, T: Deserialize<'de>, B: Buffer>(
79*890232f2SAndroid Build Coastguard Worker buf: &'de B,
80*890232f2SAndroid Build Coastguard Worker ) -> Result<T, DeserializationError> {
81*890232f2SAndroid Build Coastguard Worker let r = Reader::get_root(buf as &'de [u8])?;
82*890232f2SAndroid Build Coastguard Worker T::deserialize(r)
83*890232f2SAndroid Build Coastguard Worker }
84*890232f2SAndroid Build Coastguard Worker
85*890232f2SAndroid Build Coastguard Worker /// This struct, when pushed will be serialized as a `FlexBufferType::Blob`.
86*890232f2SAndroid Build Coastguard Worker ///
87*890232f2SAndroid Build Coastguard Worker /// A `Blob` is a variable width `length` followed by that many bytes of data.
88*890232f2SAndroid Build Coastguard Worker #[derive(Debug, PartialEq, Eq)]
89*890232f2SAndroid Build Coastguard Worker pub struct Blob<B>(pub B);
90*890232f2SAndroid Build Coastguard Worker
91*890232f2SAndroid Build Coastguard Worker impl<B: Buffer> Clone for Blob<B> {
clone(&self) -> Self92*890232f2SAndroid Build Coastguard Worker fn clone(&self) -> Self {
93*890232f2SAndroid Build Coastguard Worker Blob(self.0.shallow_copy())
94*890232f2SAndroid Build Coastguard Worker }
95*890232f2SAndroid Build Coastguard Worker }
96*890232f2SAndroid Build Coastguard Worker
97*890232f2SAndroid Build Coastguard Worker /// This struct, when pushed, will be serialized as a `FlexBufferType::IndirectUInt`.
98*890232f2SAndroid Build Coastguard Worker ///
99*890232f2SAndroid Build Coastguard Worker /// It is an unsigned integer stored by reference in the flexbuffer. This can reduce the
100*890232f2SAndroid Build Coastguard Worker /// size of vectors and maps containing the `IndirectUInt`.
101*890232f2SAndroid Build Coastguard Worker #[derive(Debug, Copy, Clone, PartialEq, Eq)]
102*890232f2SAndroid Build Coastguard Worker pub struct IndirectUInt(pub u64);
103*890232f2SAndroid Build Coastguard Worker
104*890232f2SAndroid Build Coastguard Worker /// This struct, when pushed, will be serialized as a `FlexBufferType::IndirectInt`.
105*890232f2SAndroid Build Coastguard Worker ///
106*890232f2SAndroid Build Coastguard Worker /// It is a signed integer stored by reference in the flexbuffer. This can reduce the
107*890232f2SAndroid Build Coastguard Worker /// size of vectors and maps containing the `IndirectInt`.
108*890232f2SAndroid Build Coastguard Worker #[derive(Debug, Copy, Clone, PartialEq, Eq)]
109*890232f2SAndroid Build Coastguard Worker pub struct IndirectInt(pub i64);
110*890232f2SAndroid Build Coastguard Worker
111*890232f2SAndroid Build Coastguard Worker /// This struct, when pushed, will be serialized as a `FlexBufferType::IndirectFloat`.
112*890232f2SAndroid Build Coastguard Worker ///
113*890232f2SAndroid Build Coastguard Worker /// It is a floating point stored by reference in the flexbuffer. This can reduce the
114*890232f2SAndroid Build Coastguard Worker /// size of vectors and maps containing the `IndirectFloat`.
115*890232f2SAndroid Build Coastguard Worker #[derive(Debug, Copy, Clone, PartialEq)]
116*890232f2SAndroid Build Coastguard Worker pub struct IndirectFloat(pub f64);
117