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
//! # 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::Deserialize, Debug, PartialEq)]
//! struct Test<'a> {
//! field: &'a str,
//! }
//!
//! let avro_datum = &[6, 102, 111, 111];
//! assert_eq!(
//! serde_avro_fast::from_datum_slice::<Test>(avro_datum, &schema)
//! .expect("Failed to deserialize"),
//! Test { field: "foo" }
//! );
//! ```
//! # 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
//! ```
//!
//! It currently has a dependency on [`apache_avro`], to parse the schema and
//! obtain its fingerprint.
pub use Schema;
pub use ;
/// Because we use some of its types (namely, schema), reexport it in case
/// interop is needed by users
pub use apache_avro;
/// 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 Read`
///
/// 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.