1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
//! # Getting started
//!
//! ```
//! let schema: serde_avro_fast::Schema = r#"
//! {
//! "namespace": "test",
//! "type": "record",
//! "name": "Test",
//! "fields": [
//! {
//! "type": {
//! "type": "string"
//! },
//! "name": "field"
//! }
//! ]
//! }
//! "#
//! .parse()
//! .expect("Failed to parse schema");
//!
//! #[derive(serde_derive::Serialize, serde_derive::Deserialize, Debug, PartialEq)]
//! struct Test<'a> {
//! field: &'a str,
//! }
//!
//! let rust_value = Test { field: "foo" };
//! let avro_datum = &[6, 102, 111, 111];
//!
//! // Avro datum deserialization
//! assert_eq!(
//! serde_avro_fast::from_datum_slice::<Test>(avro_datum, &schema)
//! .expect("Failed to deserialize"),
//! rust_value
//! );
//!
//! // Avro datum serialization
//! assert_eq!(
//! serde_avro_fast::to_datum(
//! &rust_value,
//! Vec::new(),
//! &mut serde_avro_fast::ser::SerializerConfig::new(&schema)
//! )
//! .expect("Failed to serialize"),
//! avro_datum
//! );
//! ```
//!
//! # Object container file encoding
//! Otherwise called "avro files", avro object container files contain a header
//! that holds the schema, followed by an arbitrary number of avro objects.
//!
//! For this use-case, please see the [`object_container_file_encoding`] module
//! documentation.
//!
//! # Deriving schema from Rust structs
//!
//! If the Rust program is the source of truth for the schema definition, it is
//! useful to define the schema as a derive on the relevant Rust structs.
//! This can be achieved using the [`serde_avro_derive`](https://docs.rs/serde_avro_derive/)
//! crate:
//!
//! ```
//! use serde_avro_derive::BuildSchema;
//!
//! #[derive(BuildSchema)]
//! struct Foo {
//! primitives: Bar,
//! }
//!
//! #[derive(BuildSchema)]
//! struct Bar {
//! a: i32,
//! b: String,
//! }
//!
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let schema: serde_avro_fast::Schema = Foo::schema()?;
//! # Ok(())
//! # }
//! ```
//! See the [`serde_avro_derive`](https://docs.rs/serde_avro_derive/) documentation
//! for more details.
//!
//! # An idiomatic (re)implementation of serde/avro (de)serialization
//!
//! At the time of writing, the other existing libraries for [Avro](https://avro.apache.org/docs/current/specification/)
//! (de)serialization do tons of unnecessary allocations, `HashMap` lookups,
//! etc... for every record they encounter.
//!
//! This version is a more idiomatic implementation, both with regards to Rust
//! and to [`serde`].
//!
//! It is consequently >10x more performant (cf benchmarks):
//! ```txt
//! apache_avro/small time: [386.57 ns 387.04 ns 387.52 ns]
//! serde_avro_fast/small time: [19.367 ns 19.388 ns 19.413 ns] <- x20 improvement
//!
//! apache_avro/big time: [1.8618 µs 1.8652 µs 1.8701 µs]
//! serde_avro_fast/big time: [165.87 ns 166.92 ns 168.09 ns] <- x11 improvement
//! ```
pub use Schema;
pub use ;
/// Deserialize from an avro "datum" (raw data, no headers...) slice
///
/// This is zero-alloc.
///
/// Your structure may contain `&'a str`s that will end up pointing directly
/// into this slice for ideal performance.
/// Deserialize from an avro "datum" (raw data, no headers...) `impl BufRead`
///
/// If you only have an `impl Read`, wrap it in a
/// [`BufReader`](std::io::BufReader) first.
///
/// If deserializing from a slice, a `Vec`, ... prefer using `from_datum_slice`,
/// as it will be more performant and enable you to borrow `&str`s from the
/// original slice.
/// Serialize an avro "datum" (raw data, no headers...)
///
/// to the provided writer
///
/// [`SerializerConfig`](ser::SerializerConfig) can be built from a schema:
/// ```
/// # use serde_avro_fast::{ser, Schema};
/// let schema: Schema = r#""int""#.parse().unwrap();
/// let serializer_config = &mut ser::SerializerConfig::new(&schema);
///
/// let mut serialized: Vec<u8> = serde_avro_fast::to_datum_vec(&3, serializer_config).unwrap();
/// assert_eq!(serialized, &[6]);
///
/// // reuse config and output buffer across serializations for ideal performance (~40% perf gain)
/// serialized.clear();
/// let serialized = serde_avro_fast::to_datum(&4, serialized, serializer_config).unwrap();
/// assert_eq!(serialized, &[8]);
/// ```
/// Serialize an avro "datum" (raw data, no headers...)
///
/// to a newly allocated Vec
///
/// Note that unless you would otherwise allocate a new `Vec` anyway, it will be
/// more efficient to use [`to_datum`] instead.
///
/// See [`to_datum`] for more details.