yason/
lib.rs

1//! Encoding and decoding support for YASON in Rust.
2//!
3//! ## Optional features
4//!
5//! ### `serde`
6//!
7//! When this optional dependency is enabled, `YasonBuf` implements the `serde::Serialize` and
8//! `serde::Deserialize` traits.
9//!
10//! ## Yason binary format
11//!
12//! ```BNF
13//! yason ::= type value
14//!
15//! type ::=
16//!     object-type |
17//!     array-type |
18//!     scalar-type |
19//!
20//! object-type ::= 1
21//! array-type ::= 2
22//! scalar-type ::=
23//!     3 |     // string
24//!     4 |     // number
25//!     5 |     // bool
26//!     6 |     // null
27//!     7 |     // 8-bit signed integer
28//!     8 |     // 16-bit signed integer
29//!     9 |     // 32-bit signed integer
30//!     10 |    // 64-bit signed integer
31//!     11 |    // 8-bit unsigned integer
32//!     12 |    // 16-bit unsigned integer
33//!     13 |    // 32-bit unsigned integer
34//!     14 |    // 64-bit unsigned integer
35//!     15 |    // 32-bit floating point
36//!     16 |    // 64-bit floating point
37//!     17 |    // binary data
38//!     18 |    // timestamp
39//!     19 |    // date
40//!     20 |    // short date
41//!     21 |    // time
42//!     22 |    // interval year-month
43//!     23 |    // interval day-time
44//!
45//! value ::=
46//!     object |
47//!     array |
48//!     scalar |
49//!
50//! scalar ::=
51//!     string |            // string
52//!     number |            // number
53//!     bool |              // bool
54//!     int8 |              // 8-bit signed integer
55//!     int16 |             // 16-bit signed integer
56//!     int32 |             // 32-bit signed integer
57//!     int64 |             // 64-bit signed integer
58//!     uint8 |             // 8-bit unsigned integer
59//!     uint16 |            // 16-bit unsigned integer
60//!     uint32 |            // 32-bit unsigned integer
61//!     uint64 |            // 64-bit unsigned integer
62//!     float32 |           // 32-bit floating point
63//!     float64 |           // 64-bit floating point
64//!     binary |            // binary data
65//!     timestamp |         // timestamp
66//!     date |              // date
67//!     short-date |        // short date
68//!     time |              // time
69//!     interval-ym |       // interval year-month
70//!     interval-dt         // interval day-time
71//!
72//! string ::= data-length uint8*
73//! number ::= uint8 uint8* // first uint8 indicates size of number
74//! bool ::= 0 | 1
75//! binary ::= data-length uint8*
76//! timestamp ::= int64
77//! date ::= int64
78//! short-date ::= int32
79//! time ::= int64
80//! interval-ym ::= int32
81//! interval-dt ::= int64
82//!
83//! data-length ::= uint8*  // If the high bit of a byte is 1,
84//!                         // the length field is continued in the next byte,
85//!                         // otherwise it is the last byte of the length field.
86//!                         // So we need 1 byte to represent lengths up to 127,
87//!                         // 2 bytes to represent lengths up to 16383, and so on...
88//!                         // Use 4 bytes at most.
89//!
90//! // key-offset is ordered by key length and lexicographical order
91//! object ::= size element-count key-offset* key-value*
92//!
93//! array ::= size element-count value-entry* outlined-value*
94//!
95//! size ::= int32  // size indicates total size of object or array
96//! element-count ::= uint16 // number of members in object or array
97//!
98//! key-offset ::= uint32
99//! key-value ::= key type value
100//! key ::= key-length uint8*
101//! key-length ::= uint16    // key length must be less than 64KB
102//!
103//! value-entry ::= type offset-or-inlined-value
104//!
105//! // This field holds either the offset to where the value is stored,
106//! // or the value itself if it is small enough to be inlined (that is 4 bytes).
107//! offset-or-inlined-value ::= uint32
108//!
109//! outlined-value ::= type value
110//! ```
111//!
112//! ## Usage
113//!
114//! ### `Scalar`
115//!
116//! To encode a `Scalar`, use [`Scalar`]:
117//!
118//! ```rust
119//! use yason::Scalar;
120//!
121//! let yason = Scalar::string("string").unwrap();
122//!
123//! let mut bytes = Vec::with_capacity(16);
124//! let yason = Scalar::string_with_vec("string", &mut bytes).unwrap();
125//! ```
126//!
127//! ### `Object` / `Array`
128//!
129//! To encode an `Object`, use [`ObjectBuilder`] or [`ObjectRefBuilder`]:
130//!
131//! ```rust
132//! use yason::{DataType, ObjectBuilder, ObjectRefBuilder};
133//!
134//! let mut builder = ObjectBuilder::try_new(2, false).unwrap();
135//! builder.push_string("key1", "value").unwrap();
136//! builder.push_bool("key2", true);
137//! let yason = builder.finish().unwrap();
138//! assert_eq!(yason.data_type().unwrap(), DataType::Object);
139//!
140//! let mut bytes = Vec::with_capacity(16);
141//! let mut builder = ObjectRefBuilder::try_new(&mut bytes, 1, false).unwrap();
142//! builder.push_string("key", "value").unwrap();
143//! let yason = builder.finish().unwrap();
144//! assert_eq!(yason.data_type().unwrap(), DataType::Object);
145//! ```
146//! To encode an `Array`, use [`ArrayBuilder`] or [`ArrayRefBuilder`]:
147//!
148//! ```rust
149//! use yason::{DataType, ArrayBuilder, ArrayRefBuilder};
150//!
151//! let mut builder = ArrayBuilder::try_new(2).unwrap();
152//! builder.push_string("string").unwrap();
153//! builder.push_bool(true);
154//! let yason = builder.finish().unwrap();
155//! assert_eq!(yason.data_type().unwrap(), DataType::Array);
156//!
157//! let mut bytes = Vec::with_capacity(16);
158//! let mut builder = ArrayRefBuilder::try_new(&mut bytes, 1).unwrap();
159//! builder.push_string("string").unwrap();
160//! let yason = builder.finish().unwrap();
161//! assert_eq!(yason.data_type().unwrap(), DataType::Array);
162//! ```
163//!
164//! ### Nested `Object` / `Array`
165//! To encode an `Object` or `Array` that contains nested `Object` or `Array`:
166//!
167//! ```rust
168//! use yason::{DataType, ObjectBuilder};
169//! let mut obj_builder = ObjectBuilder::try_new(1, true).unwrap();
170//! let mut array_builder = obj_builder.push_array("key", 1).unwrap();
171//! array_builder.push_bool(true).unwrap();
172//!
173//! array_builder.finish().unwrap();
174//! let yason = obj_builder.finish().unwrap();
175//! assert_eq!(yason.data_type().unwrap(), DataType::Object);
176//! ```
177//!
178
179#![cfg_attr(docsrs, feature(doc_cfg))]
180
181mod binary;
182mod builder;
183mod data_type;
184mod format;
185mod json;
186mod path;
187mod util;
188mod vec;
189mod yason;
190
191#[cfg(feature = "serde")]
192mod serde;
193
194pub use self::{
195    builder::{ArrayBuilder, ArrayRefBuilder, BuildError, NumberError, ObjectBuilder, ObjectRefBuilder, Scalar},
196    data_type::{DataType, InvalidDataType},
197    format::FormatError,
198    path::{PathExpression, PathParseError, QueriedValue},
199    yason::{Array, ArrayIter, KeyIter, Object, ObjectIter, Value, ValueIter, Yason, YasonBuf, YasonError},
200};
201pub use decimal_rs::Decimal as Number;