msgpack-schema Crates.io docs.rs CI

msgpack-schema is a schema language for describing data formats encoded in MessagePack. It provides two derive macros Serialize and Deserialize that allow you to transcode MessagePack binary data to/from Rust data structures in a type-directed way.

```rust use msgpack_schema::{Deserialize, Serialize};

[derive(Deserialize, Serialize)]

struct Human { #[tag = 0] name: String, #[tag = 2] #[optional] age: Option, } ```

Behaviours of serializers and deserializers

Some general rules

Structs with named fields

Structs with named fields will be serialized into a MsgPack map object whose keys are fixints specified by #[tag] attributes.

schema Rust MessagePack
```rust struct S { #[tag = 0] foo: u32, #[tag = 1] bar: String, } ``` ```rust S { foo: 42, bar: "hello".to_owned() } ``` ```js { 0: 42, 1: "hello" } ```

Fields in named structs may be tagged with #[optional].

The #[flatten] attribute is used to factor out a single definition of named struct into multiple ones.

```rust

use msgpack_schema::*;

[derive(Serialize)]

struct S1 { #[tag = 1] x: u32, }

[derive(Serialize)]

struct S2 { #[flatten] s1: S1, #[tag = 2] y: u32, }

[derive(Serialize)]

struct S3 { #[tag = 1] x: u32, #[tag = 2] y: u32, }

assert_eq!(serialize(S2 { s1: S1 { x: 42 }, y: 43, }), serialize(S3 { x: 42, y: 43 })); ```

Untagged structs with named fields

Structs with named fields may be attached #[untagged]. Untagged structs are serialized into an array and will not contain tags.

schema Rust MessagePack
```rust #[untagged] struct S { foo: u32, bar: String, } ``` ```rust S { foo: 42, bar: "hello".to_owned() } ``` ```js [ 42, "hello" ] ```

Newtype structs

Tuple structs with only one element are treated transparently.

schema Rust MessagePack
```rust struct S(u32) ``` ```rust S(42) ``` ```js 42 ```

Unit structs and empty tuple structs

Serialization and deserialization of unit structs and empty tuple structs are currently unsupported.

schema Rust MessagePack
```rust struct S ``` ```rust S ``` UNSUPPORTED
```rust struct S() ``` ```rust S() ``` UNSUPPORTED

Tuple structs

Tuple structs with more than one element are encoded as an array.

schema Rust MessagePack
```rust struct S(u32, bool) ``` ```rust S(42, true) ``` ```js [ 42, true ] ```

Unit variants and empty tuple variants

Unit variants and empty tuple variants are serialized into a single fixint whose value is determined by the tag.

schema Rust MessagePack
```rust enum E { #[tag = 3] Foo } ``` ```rust E::Foo ``` ```js 3 ```
```rust enum E { #[tag = 3] Foo() } ``` ```rust E::Foo() ``` ```js 3 ```

Newtype variants

Newtype variants (one-element tuple variants) are serialized into an array of the tag and the inner value.

schema Rust MessagePack
```rust enum E { #[tag = 3] Foo(u32) } ``` ```rust E::Foo(42) ``` ```js [ 3, 42 ] ```

Untagged variants

Enums may be attached #[untagged] when all variants are newtype variants. Serializing untagged variants results in the same data layout as the inner type. The deserializer deserializes into an untagged enum type by trying deserization one by one from the first variant to the last.

schema Rust MessagePack
```rust #[derive(Serialize, Deserialize)] #[untagged] enum Animal { Foo(String), Bar(u32), } ``` ```rust E::Bar(42) ``` ```js 42 ```

License

Licensed under MIT license.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in msgpack-schema by you shall be licensed as above, without any additional terms or conditions.