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;